@fab1o978/react-ui 0.2.2 → 0.2.4

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Button/Button.module.scss","../src/components/Button/Button.tsx","../src/components/Input/Input.module.scss","../src/components/Input/Input.tsx","../src/components/Badge/Badge.module.scss","../src/components/Badge/Badge.tsx","../src/components/RainCanvas/RainCanvas.module.scss","../src/components/RainCanvas/RainCanvas.tsx","../src/components/Timeline/Timeline.module.scss","../src/utils/color.ts","../src/components/Timeline/Timeline.tsx","../src/components/ColorPicker/ColorPicker.module.scss","../src/components/SliderControl/SliderControl.module.scss","../src/components/SliderControl/SliderControl.tsx","../src/components/ColorPicker/ColorPicker.tsx","../src/components/SlidingCounter/SlidingCounter.module.scss","../src/components/SlidingCounter/SlidingCounter.tsx","../src/components/RichTextEditor/RichTextEditor.module.scss","../src/components/RichTextEditor/RichTextEditor.tsx","../node_modules/@tiptap/core/src/helpers/createChainableState.ts","../node_modules/@tiptap/core/src/CommandManager.ts","../node_modules/@tiptap/core/src/commands/index.ts","../node_modules/@tiptap/core/src/commands/blur.ts","../node_modules/@tiptap/core/src/commands/clearContent.ts","../node_modules/@tiptap/core/src/commands/clearNodes.ts","../node_modules/@tiptap/core/src/commands/command.ts","../node_modules/@tiptap/core/src/commands/createParagraphNear.ts","../node_modules/@tiptap/core/src/commands/cut.ts","../node_modules/@tiptap/core/src/commands/deleteCurrentNode.ts","../node_modules/@tiptap/core/src/helpers/getNodeType.ts","../node_modules/@tiptap/core/src/commands/deleteNode.ts","../node_modules/@tiptap/core/src/commands/deleteRange.ts","../node_modules/@tiptap/core/src/commands/deleteSelection.ts","../node_modules/@tiptap/core/src/commands/enter.ts","../node_modules/@tiptap/core/src/commands/exitCode.ts","../node_modules/@tiptap/core/src/utilities/isRegExp.ts","../node_modules/@tiptap/core/src/utilities/objectIncludes.ts","../node_modules/@tiptap/core/src/helpers/getMarkRange.ts","../node_modules/@tiptap/core/src/helpers/getMarkType.ts","../node_modules/@tiptap/core/src/commands/extendMarkRange.ts","../node_modules/@tiptap/core/src/commands/first.ts","../node_modules/@tiptap/core/src/helpers/isTextSelection.ts","../node_modules/@tiptap/core/src/utilities/minMax.ts","../node_modules/@tiptap/core/src/helpers/resolveFocusPosition.ts","../node_modules/@tiptap/core/src/utilities/isAndroid.ts","../node_modules/@tiptap/core/src/utilities/isiOS.ts","../node_modules/@tiptap/core/src/utilities/isSafari.ts","../node_modules/@tiptap/core/src/commands/focus.ts","../node_modules/@tiptap/core/src/commands/forEach.ts","../node_modules/@tiptap/core/src/commands/insertContent.ts","../node_modules/@tiptap/core/src/utilities/elementFromString.ts","../node_modules/@tiptap/core/src/helpers/createNodeFromContent.ts","../node_modules/@tiptap/core/src/helpers/selectionToInsertionEnd.ts","../node_modules/@tiptap/core/src/commands/insertContentAt.ts","../node_modules/@tiptap/core/src/commands/join.ts","../node_modules/@tiptap/core/src/commands/joinItemBackward.ts","../node_modules/@tiptap/core/src/commands/joinItemForward.ts","../node_modules/@tiptap/core/src/commands/joinTextblockBackward.ts","../node_modules/@tiptap/core/src/commands/joinTextblockForward.ts","../node_modules/@tiptap/core/src/utilities/isMacOS.ts","../node_modules/@tiptap/core/src/commands/keyboardShortcut.ts","../node_modules/@tiptap/core/src/helpers/isNodeActive.ts","../node_modules/@tiptap/core/src/commands/lift.ts","../node_modules/@tiptap/core/src/commands/liftEmptyBlock.ts","../node_modules/@tiptap/core/src/commands/liftListItem.ts","../node_modules/@tiptap/core/src/commands/newlineInCode.ts","../node_modules/@tiptap/core/src/helpers/getSchemaTypeNameByName.ts","../node_modules/@tiptap/core/src/utilities/deleteProps.ts","../node_modules/@tiptap/core/src/commands/resetAttributes.ts","../node_modules/@tiptap/core/src/commands/scrollIntoView.ts","../node_modules/@tiptap/core/src/commands/selectAll.ts","../node_modules/@tiptap/core/src/commands/selectNodeBackward.ts","../node_modules/@tiptap/core/src/commands/selectNodeForward.ts","../node_modules/@tiptap/core/src/commands/selectParentNode.ts","../node_modules/@tiptap/core/src/commands/selectTextblockEnd.ts","../node_modules/@tiptap/core/src/commands/selectTextblockStart.ts","../node_modules/@tiptap/core/src/helpers/createDocument.ts","../node_modules/@tiptap/core/src/commands/setContent.ts","../node_modules/@tiptap/core/src/helpers/getMarkAttributes.ts","../node_modules/@tiptap/core/src/helpers/combineTransactionSteps.ts","../node_modules/@tiptap/core/src/helpers/defaultBlockAt.ts","../node_modules/@tiptap/core/src/helpers/findParentNodeClosestToPos.ts","../node_modules/@tiptap/core/src/helpers/findParentNode.ts","../node_modules/@tiptap/core/src/helpers/getExtensionField.ts","../node_modules/@tiptap/core/src/utilities/isFunction.ts","../node_modules/@tiptap/core/src/utilities/callOrReturn.ts","../node_modules/@tiptap/core/src/helpers/splitExtensions.ts","../node_modules/@tiptap/core/src/utilities/mergeAttributes.ts","../node_modules/@tiptap/core/src/helpers/getTextBetween.ts","../node_modules/@tiptap/core/src/helpers/getTextSerializersFromSchema.ts","../node_modules/@tiptap/core/src/utilities/removeDuplicates.ts","../node_modules/@tiptap/core/src/helpers/getChangedRanges.ts","../node_modules/@tiptap/core/src/helpers/getSplittedAttributes.ts","../node_modules/@tiptap/core/src/helpers/isMarkActive.ts","../node_modules/@tiptap/core/src/helpers/isList.ts","../node_modules/@tiptap/core/src/helpers/isNodeEmpty.ts","../node_modules/@tiptap/core/src/commands/setMark.ts","../node_modules/@tiptap/core/src/commands/setMeta.ts","../node_modules/@tiptap/core/src/commands/setNode.ts","../node_modules/@tiptap/core/src/commands/setNodeSelection.ts","../node_modules/@tiptap/core/src/commands/setTextDirection.ts","../node_modules/@tiptap/core/src/commands/setTextSelection.ts","../node_modules/@tiptap/core/src/commands/sinkListItem.ts","../node_modules/@tiptap/core/src/commands/splitBlock.ts","../node_modules/@tiptap/core/src/commands/splitListItem.ts","../node_modules/@tiptap/core/src/commands/toggleList.ts","../node_modules/@tiptap/core/src/commands/toggleMark.ts","../node_modules/@tiptap/core/src/commands/toggleNode.ts","../node_modules/@tiptap/core/src/commands/toggleWrap.ts","../node_modules/@tiptap/core/src/commands/undoInputRule.ts","../node_modules/@tiptap/core/src/commands/unsetAllMarks.ts","../node_modules/@tiptap/core/src/commands/unsetMark.ts","../node_modules/@tiptap/core/src/commands/unsetTextDirection.ts","../node_modules/@tiptap/core/src/commands/updateAttributes.ts","../node_modules/@tiptap/core/src/commands/wrapIn.ts","../node_modules/@tiptap/core/src/commands/wrapInList.ts","../node_modules/@tiptap/core/src/utilities/isPlainObject.ts","../node_modules/@tiptap/core/src/utilities/mergeDeep.ts","../node_modules/@tiptap/core/src/Extendable.ts","../node_modules/@tiptap/core/src/Mark.ts","../node_modules/@tiptap/core/src/extensions/index.ts","../node_modules/@tiptap/core/src/Extension.ts","../node_modules/@tiptap/core/src/extensions/clipboardTextSerializer.ts","../node_modules/@tiptap/core/src/extensions/commands.ts","../node_modules/@tiptap/core/src/extensions/delete.ts","../node_modules/@tiptap/core/src/extensions/drop.ts","../node_modules/@tiptap/core/src/extensions/editable.ts","../node_modules/@tiptap/core/src/extensions/focusEvents.ts","../node_modules/@tiptap/core/src/extensions/keymap.ts","../node_modules/@tiptap/core/src/extensions/paste.ts","../node_modules/@tiptap/core/src/extensions/tabindex.ts","../node_modules/@tiptap/core/src/extensions/textDirection.ts","../node_modules/@tiptap/core/src/utilities/markdown/index.ts","../node_modules/@tiptap/core/src/utilities/markdown/attributeUtils.ts","../node_modules/@tiptap/core/src/utilities/markdown/createAtomBlockMarkdownSpec.ts","../node_modules/@tiptap/core/src/utilities/markdown/createBlockMarkdownSpec.ts","../node_modules/@tiptap/core/src/utilities/markdown/createInlineMarkdownSpec.ts","../node_modules/@tiptap/core/src/utilities/markdown/parseIndentedBlocks.ts","../node_modules/@tiptap/core/src/utilities/markdown/renderNestedMarkdownContent.ts","../node_modules/@tiptap/core/src/Node.ts","../src/components/RichTextEditor/extensions/Highlight.ts","../src/components/RichTextEditor/extensions/HighlightButton.tsx","../src/components/RichTextEditor/extensions/PageBreak.ts","../src/components/RichTextEditor/extensions/PageBreakButton.tsx","../src/components/ColorWheel/ColorWheel.module.scss","../src/components/ColorWheel/usePointerDrag.ts","../src/components/ColorWheel/useUnwrappedAngle.ts","../src/components/ColorWheel/colorMath.ts","../src/components/ColorWheel/ColorWheel.tsx"],"names":["button","primary","secondary","danger","ghost","sm","md","lg","fullWidth","loading","spinner","spin","wrapper","label","inputWrapper","input","error","adornment","adornmentEnd","withStart","withEnd","helperText","errorText","React","jsxs","jsx","badge","default","success","warning","dotIndicator","trailCanvas","content","dropContainer","filterId","timeline","vertical","item","track","connector","last","horizontal","dot","iconSlot","completed","dotIn","active","pulse","pending","title","description","connectorHidden","connectorDone","colorPicker","topRow","discWrapper","disc","previewSwatch","eyedropperBtn","inputSection","tabs","tab","tabActive","inputAddon","inputCopyBtn","recents","recentsLabel","swatches","recentSwatch","disabled","icon","trackArea","groove","rail","fill","thumb","thumbDragging","tooltip","tooltipVisible","useRef","useEffect","CheckIcon","useState","rr","gg","bb","useCallback","counter","sign","separator","reelWindow","reel","digitCell","root","readOnly","toolbar","toolbarGroup","divider","toolbarButton","headingButton","bubbleMenu","editorContent","Fragment","command","run","originalCreateParagraphNear","originalExitCode","mark","TextSelection","ProseMirrorNode","Selection","isTextSelection","originalJoinUp","originalJoinDown","originalJoinBackward","originalJoinForward","joinPoint","originalCommand","isActive","originalLift","originalLiftEmptyBlock","originalLiftListItem","originalNewlineInCode","originalSelectNodeBackward","originalSelectNodeForward","originalSelectParentNode","originalSelectTextblockEnd","originalSelectTextblockStart","document","range","NodeSelection","originalSinkListItem","first","newNextTypeAttributes","nextType","canSplit","originalWrapIn","originalWrapInList","Plugin","_a","_b","_c","PluginKey","tr","parseAttributes","serializeAttributes","h","nextIndent","Node","useCurrentEditor","recentsEmpty","chipWrap","chipWrapRemoving","chip","chipRemove","picker","glow","modeToggle","modePill","modeButton","stage","stageShadow","ring","hueHandlePivot","hueHandle","alphaArcShadowWrap","alphaArcShadow","alphaArc","alphaArcFill","alphaArcCap","alphaArcCapStart","alphaArcCapEnd","alphaArcHandle","currentDisc","discFill","currentHex","currentHexInput","copied","discBadge","discBadgeTop","discBadgeBottom","clamp","dragging"],"mappings":"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","file":"index.js","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.button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n font-family: var(--font-family-base);\n font-weight: 500;\n letter-spacing: -0.01em;\n border: 1px solid transparent;\n border-radius: var(--radius-md);\n cursor: pointer;\n transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), box-shadow var(--transition-fast);\n white-space: nowrap;\n text-decoration: none;\n outline-offset: 2px;\n}\n\n.button:focus-visible {\n outline: 2px solid var(--color-primary-500);\n}\n\n.button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Variants */\n.primary {\n background-color: var(--color-primary-600);\n color: var(--color-neutral-0);\n}\n\n.primary:hover:not(:disabled) {\n background-color: var(--color-primary-700);\n}\n\n.secondary {\n background-color: var(--color-neutral-0);\n color: var(--color-neutral-900);\n border-color: var(--color-neutral-200);\n box-shadow: var(--shadow-sm);\n}\n\n.secondary:hover:not(:disabled) {\n background-color: var(--color-neutral-100);\n}\n\n.danger {\n background-color: var(--color-danger-500);\n color: var(--color-neutral-0);\n}\n\n.danger:hover:not(:disabled) {\n background-color: var(--color-danger-600);\n}\n\n.ghost {\n background-color: transparent;\n color: var(--color-neutral-600);\n}\n\n.ghost:hover:not(:disabled) {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n/* Sizes */\n.sm {\n font-size: var(--font-size-xs);\n padding: var(--spacing-1) var(--spacing-3);\n height: 2rem;\n}\n\n.md {\n font-size: var(--font-size-sm);\n padding: var(--spacing-2) var(--spacing-4);\n height: 2.5rem;\n}\n\n.lg {\n font-size: var(--font-size-md);\n padding: var(--spacing-3) var(--spacing-4);\n height: 3rem;\n}\n\n.fullWidth {\n width: 100%;\n}\n\n/* Loading */\n.loading {\n position: relative;\n}\n\n.spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: var(--radius-full);\n animation: spin 0.6s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIkJ1dHRvbi5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFUTtBQUtSO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBR0E7RUFHQTtFQUNBOzs7QUFRRjtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUNBO0VBSUE7RUFHQTtFQUNBOzs7QUNqR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUVGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTs7O0FBRUY7RUFDRTtFQUNBOzs7QUFHRjtBQUNBO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0FBQ0E7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7SUFDRSIsInNvdXJjZXNDb250ZW50IjpbIkB1c2UgXCJzYXNzOmNvbG9yXCI7XG5cbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs1MDA7NjAwJmRpc3BsYXk9c3dhcFwiKTtcblxuLy8gQWNjZW50IGRpIGRlZmF1bHQg4oCUIGNhbWJpYSBxdWkgcGVyIGFnZ2lvcm5hcmUgdHV0dGEgbGEgbGlicmVyaWFcbiRhY2NlbnQ6ICMzYjgyZjY7XG5cbjpyb290IHtcbiAgLy8gQWNjZW50IHNjYWxlIOKAlCBkZXJpdmF0YSBkYSAkYWNjZW50IGEgY29tcGlsZSB0aW1lXG4gIC0tYWNjZW50OiAgICAgICAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtZG90OiAgICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWFjY2VudC10cmFjazogICN7JGFjY2VudH07XG4gIC0tYWNjZW50LXJpbmc6ICAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtZ2xvdzogICAje2NvbG9yLmNoYW5nZSgkYWNjZW50LCAkYWxwaGE6IDAuMyl9O1xuICAtLWFjY2VudC1saWdodDogICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDUlLCAkc2F0dXJhdGlvbjogLTIwJSl9O1xuXG4gIC8vIFByaW1hcnkgc2NhbGUgKG1hbnRlbnV0YSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoCBjb24gQnV0dG9uLCBCYWRnZSwgSW5wdXQpXG4gIC0tY29sb3ItcHJpbWFyeS01MDogICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDklLCAkc2F0dXJhdGlvbjogLTMwJSl9O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQyJSwgJHNhdHVyYXRpb246IC0xNSUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTQwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAxMiUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTUwMDogI3skYWNjZW50fTtcbiAgLS1jb2xvci1wcmltYXJ5LTYwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMTAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS03MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogLTIwJSl9O1xuXG4gIC8vIE5ldXRyYWxcbiAgLS1jb2xvci1uZXV0cmFsLTA6ICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1uZXV0cmFsLTEwMDogI2YzZjRmNjtcbiAgLS1jb2xvci1uZXV0cmFsLTIwMDogI2U1ZTdlYjtcbiAgLS1jb2xvci1uZXV0cmFsLTQwMDogIzljYTNhZjtcbiAgLS1jb2xvci1uZXV0cmFsLTYwMDogIzRiNTU2MztcbiAgLS1jb2xvci1uZXV0cmFsLTkwMDogIzExMTgyNztcblxuICAvLyBTZW1hbnRpY1xuICAtLWNvbG9yLXN1Y2Nlc3MtNTAwOiAjMjJjNTVlO1xuICAtLWNvbG9yLXN1Y2Nlc3MtNjAwOiAjMTZhMzRhO1xuICAtLWNvbG9yLWRhbmdlci01MDA6ICAjZWY0NDQ0O1xuICAtLWNvbG9yLWRhbmdlci02MDA6ICAjZGMyNjI2O1xuICAtLWNvbG9yLXdhcm5pbmctNTAwOiAjZjU5ZTBiO1xuICAtLWNvbG9yLXdhcm5pbmctNjAwOiAjZDk3NzA2O1xuXG4gIC8vIFR5cG9ncmFwaHlcbiAgLS1mb250LWZhbWlseS1iYXNlOiBcIkludGVyXCIsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZjtcbiAgLS1mb250LXNpemUteHM6IDAuNzVyZW07XG4gIC0tZm9udC1zaXplLXNtOiAwLjg3NXJlbTtcbiAgLS1mb250LXNpemUtbWQ6IDFyZW07XG4gIC0tZm9udC1zaXplLWxnOiAxLjEyNXJlbTtcblxuICAvLyBTcGFjaW5nXG4gIC0tc3BhY2luZy0xOiAwLjI1cmVtO1xuICAtLXNwYWNpbmctMjogMC41cmVtO1xuICAtLXNwYWNpbmctMzogMC43NXJlbTtcbiAgLS1zcGFjaW5nLTQ6IDFyZW07XG5cbiAgLy8gUmFkaXVzXG4gIC0tcmFkaXVzLXNtOiAgIDAuMjVyZW07XG4gIC0tcmFkaXVzLW1kOiAgIDAuMzc1cmVtO1xuICAtLXJhZGl1cy1sZzogICAwLjVyZW07XG4gIC0tcmFkaXVzLWZ1bGw6IDk5OTlweDtcblxuICAvLyBTaGFkb3dzXG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjA1KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuMSk7XG5cbiAgLy8gVHJhbnNpdGlvbnNcbiAgLS10cmFuc2l0aW9uLWZhc3Q6IDE1MG1zIGVhc2U7XG5cbiAgLy8gU3VyZmFjZSAoYmFja2dyb3VuZCBkaSBjYXJkL3BhbmVsKVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICNmZmZmZmY7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogI2ZmZmZmZjtcbn1cblxuLy8g4pSA4pSA4pSAIERhcmsgdGhlbWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBBcHBsaWNhdG8gdmlhIGRhdGEtdGhlbWU9XCJkYXJrXCIgc3VsbCdlbGVtZW50byByb290IChnZXN0aXRvIGRhIFN0b3J5Ym9vayBkZWNvcmF0b3Jcbi8vIGUgZGFsbCdhcHAgY29uc3VtZXIpLiBJIGNvbXBvbmVudGkgbm9uIGRldm9ubyBmYXJlIG51bGxhIGRpIHNwZWNpYWxlOiBiYXN0YSBjaGVcbi8vIHVzaW5vIGkgdG9rZW4gdmFyKCkgZSByaWNldmVyYW5ubyBhdXRvbWF0aWNhbWVudGUgaSB2YWxvcmkgZGFyay5cblxuW2RhdGEtdGhlbWU9XCJkYXJrXCJdIHtcbiAgLy8gTmV1dHJhbCAoc2NhbGEgaW52ZXJ0aXRhKVxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjMGYxNzJhO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjMWUyOTNiO1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjMzM0MTU1O1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOTRhM2I4O1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjY2JkNWUxO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjZjhmYWZjO1xuXG4gIC8vIFN1cmZhY2VcbiAgLS1jb2xvci1zdXJmYWNlOiAgICAgICAgICAjMWUyOTNiO1xuICAtLWNvbG9yLXN1cmZhY2UtZWxldmF0ZWQ6ICMyNzM1NDk7XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSBkYXJrIChwZXIgaWwgZGVmYXVsdCBhY2NlbnQgYmx1IOKAlCBsZSBzZnVtYXR1cmUgY2hpYXJlIGRpdmVudGFubyBzY3VyZSlcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgIzE3MjU1NDtcbiAgLS1jb2xvci1wcmltYXJ5LTEwMDogIzFlM2E4YTtcbiAgLy8gNDAwIC8gNTAwIC8gNjAwIC8gNzAwIHJpbWFuZ29ubyBpbnZhcmlhdGkgKGFiYmFzdGFuemEgc2F0dXJpIHN1IGJnIHNjdXJvKVxuXG4gIC8vIEFjY2VudCBsaWdodDogdmFyaWFudGUgc2N1cmFcbiAgLS1hY2NlbnQtbGlnaHQ6ICMxNzI1NTQ7XG5cbiAgLy8gU2hhZG93cyAocGnDuSBmb3J0aSBzdSBiZyBzY3VybylcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuNCk7XG4gIC0tc2hhZG93LW1kOiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjUpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjQpO1xufVxuIiwiQGltcG9ydCBcIi4uLy4uL3N0eWxlcy90b2tlbnMuc2Nzc1wiO1xuXG4uYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBnYXA6IHZhcigtLXNwYWNpbmctMik7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSxcbiAgICBib3JkZXItY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSwgY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSxcbiAgICBib3gtc2hhZG93IHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cblxuLmJ1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWNvbG9yLXByaW1hcnktNTAwKTtcbn1cblxuLmJ1dHRvbjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLyogVmFyaWFudHMgKi9cbi5wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItcHJpbWFyeS02MDApO1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbn1cbi5wcmltYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItcHJpbWFyeS03MDApO1xufVxuXG4uc2Vjb25kYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG4gIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1zbSk7XG59XG4uc2Vjb25kYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0xMDApO1xufVxuXG4uZGFuZ2VyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItZGFuZ2VyLTUwMCk7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTApO1xufVxuLmRhbmdlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWRhbmdlci02MDApO1xufVxuXG4uZ2hvc3Qge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNjAwKTtcbn1cbi5naG9zdDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMTAwKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbn1cblxuLyogU2l6ZXMgKi9cbi5zbSB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXhzKTtcbiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy0xKSB2YXIoLS1zcGFjaW5nLTMpO1xuICBoZWlnaHQ6IDJyZW07XG59XG5cbi5tZCB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXNtKTtcbiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy0yKSB2YXIoLS1zcGFjaW5nLTQpO1xuICBoZWlnaHQ6IDIuNXJlbTtcbn1cblxuLmxnIHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtbWQpO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTMpIHZhcigtLXNwYWNpbmctNCk7XG4gIGhlaWdodDogM3JlbTtcbn1cblxuLmZ1bGxXaWR0aCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vKiBMb2FkaW5nICovXG4ubG9hZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNwaW5uZXIge1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgYm9yZGVyOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICBhbmltYXRpb246IHNwaW4gMC42cyBsaW5lYXIgaW5maW5pdGU7XG59XG5cbkBrZXlmcmFtZXMgc3BpbiB7XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG4iXX0= */","import React from \"react\";\nimport styles from \"./Button.module.scss\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n disabled,\n children,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <button\n ref={ref}\n disabled={disabled || loading}\n className={[\n styles.button,\n styles[variant],\n styles[size],\n fullWidth ? styles.fullWidth : \"\",\n loading ? styles.loading : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {loading && <span className={styles.spinner} aria-hidden=\"true\" />}\n {children}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n","@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: inline-flex;\n flex-direction: column;\n gap: var(--spacing-1);\n}\n\n.fullWidth {\n width: 100%;\n}\n\n.label {\n font-family: var(--font-family-base);\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-neutral-900);\n letter-spacing: -0.01em;\n}\n\n.inputWrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.input {\n width: 100%;\n font-family: var(--font-family-base);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n background-color: var(--color-neutral-0);\n color: var(--color-neutral-900);\n outline: none;\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n\n.input::placeholder {\n color: var(--color-neutral-400);\n}\n\n.input:focus {\n border-color: var(--color-primary-500);\n box-shadow: 0 0 0 3px var(--color-primary-100);\n}\n\n.input:disabled {\n background-color: var(--color-neutral-100);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.input.error {\n border-color: var(--color-danger-500);\n}\n\n.input.error:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n}\n\n/* Sizes */\n.sm .input {\n font-size: var(--font-size-xs);\n padding: var(--spacing-1) var(--spacing-2);\n height: 2rem;\n}\n\n.md .input {\n font-size: var(--font-size-sm);\n padding: var(--spacing-2) var(--spacing-3);\n height: 2.5rem;\n}\n\n.lg .input {\n font-size: var(--font-size-md);\n padding: var(--spacing-3) var(--spacing-4);\n height: 3rem;\n}\n\n/* Adornments */\n.adornment {\n position: absolute;\n left: var(--spacing-3);\n display: flex;\n align-items: center;\n color: var(--color-neutral-400);\n pointer-events: none;\n}\n\n.adornmentEnd {\n left: unset;\n right: var(--spacing-3);\n}\n\n.sm .withStart {\n padding-left: 2rem;\n}\n\n.md .withStart {\n padding-left: 2.25rem;\n}\n\n.lg .withStart {\n padding-left: 2.5rem;\n}\n\n.sm .withEnd {\n padding-right: 2rem;\n}\n\n.md .withEnd {\n padding-right: 2.25rem;\n}\n\n.lg .withEnd {\n padding-right: 2.5rem;\n}\n\n.helperText {\n font-family: var(--font-family-base);\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n}\n\n.errorText {\n font-family: var(--font-family-base);\n font-size: var(--font-size-xs);\n color: var(--color-danger-500);\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIklucHV0Lm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ2pHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFOzs7QUFHRjtBQUNBO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFBaUI7OztBQUNqQjtFQUFpQjs7O0FBQ2pCO0VBQWlCOzs7QUFFakI7RUFBZTs7O0FBQ2Y7RUFBZTs7O0FBQ2Y7RUFBZTs7O0FBRWY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3Rva2Vucy5zY3NzXCI7XG5cbi53cmFwcGVyIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogdmFyKC0tc3BhY2luZy0xKTtcbn1cblxuLmZ1bGxXaWR0aCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ubGFiZWwge1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXNtKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XG59XG5cbi5pbnB1dFdyYXBwZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5pbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgb3V0bGluZTogbm9uZTtcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLXRyYW5zaXRpb24tZmFzdCksIGJveC1zaGFkb3cgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KTtcbn1cblxuLmlucHV0OjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG59XG5cbi5pbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItcHJpbWFyeS01MDApO1xuICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY29sb3ItcHJpbWFyeS0xMDApO1xufVxuXG4uaW5wdXQ6ZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTEwMCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIG9wYWNpdHk6IDAuNjtcbn1cblxuLmlucHV0LmVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1kYW5nZXItNTAwKTtcbn1cblxuLmlucHV0LmVycm9yOmZvY3VzIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYigyMzkgNjggNjggLyAwLjE1KTtcbn1cblxuLyogU2l6ZXMgKi9cbi5zbSAuaW5wdXQge1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS14cyk7XG4gIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMSkgdmFyKC0tc3BhY2luZy0yKTtcbiAgaGVpZ2h0OiAycmVtO1xufVxuXG4ubWQgLmlucHV0IHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtc20pO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTIpIHZhcigtLXNwYWNpbmctMyk7XG4gIGhlaWdodDogMi41cmVtO1xufVxuXG4ubGcgLmlucHV0IHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtbWQpO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTMpIHZhcigtLXNwYWNpbmctNCk7XG4gIGhlaWdodDogM3JlbTtcbn1cblxuLyogQWRvcm5tZW50cyAqL1xuLmFkb3JubWVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogdmFyKC0tc3BhY2luZy0zKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hZG9ybm1lbnRFbmQge1xuICBsZWZ0OiB1bnNldDtcbiAgcmlnaHQ6IHZhcigtLXNwYWNpbmctMyk7XG59XG5cbi5zbSAud2l0aFN0YXJ0IHsgcGFkZGluZy1sZWZ0OiAycmVtOyB9XG4ubWQgLndpdGhTdGFydCB7IHBhZGRpbmctbGVmdDogMi4yNXJlbTsgfVxuLmxnIC53aXRoU3RhcnQgeyBwYWRkaW5nLWxlZnQ6IDIuNXJlbTsgfVxuXG4uc20gLndpdGhFbmQgeyBwYWRkaW5nLXJpZ2h0OiAycmVtOyB9XG4ubWQgLndpdGhFbmQgeyBwYWRkaW5nLXJpZ2h0OiAyLjI1cmVtOyB9XG4ubGcgLndpdGhFbmQgeyBwYWRkaW5nLXJpZ2h0OiAyLjVyZW07IH1cblxuLmhlbHBlclRleHQge1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXhzKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbn1cblxuLmVycm9yVGV4dCB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBjb2xvcjogdmFyKC0tY29sb3ItZGFuZ2VyLTUwMCk7XG59XG4iXX0= */","import React from \"react\";\nimport styles from \"./Input.module.scss\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n label?: string;\n helperText?: string;\n errorText?: string;\n size?: InputSize;\n fullWidth?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n helperText,\n errorText,\n size = \"md\",\n fullWidth = false,\n startAdornment,\n endAdornment,\n id,\n className,\n ...props\n },\n ref\n ) => {\n const inputId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, \"-\") : undefined);\n const hasError = Boolean(errorText);\n\n return (\n <div\n className={[\n styles.wrapper,\n fullWidth ? styles.fullWidth : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n )}\n <div className={[styles.inputWrapper, styles[size]].join(\" \")}>\n {startAdornment && (\n <span className={styles.adornment}>{startAdornment}</span>\n )}\n <input\n ref={ref}\n id={inputId}\n className={[\n styles.input,\n hasError ? styles.error : \"\",\n startAdornment ? styles.withStart : \"\",\n endAdornment ? styles.withEnd : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-invalid={hasError}\n aria-describedby={\n errorText\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined\n }\n {...props}\n />\n {endAdornment && (\n <span className={[styles.adornment, styles.adornmentEnd].join(\" \")}>\n {endAdornment}\n </span>\n )}\n </div>\n {errorText && (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {errorText}\n </span>\n )}\n {helperText && !errorText && (\n <span id={`${inputId}-helper`} className={styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n","@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.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-1);\n font-family: var(--font-family-base);\n font-weight: 500;\n letter-spacing: 0.01em;\n border-radius: var(--radius-full);\n white-space: nowrap;\n}\n\n/* Sizes */\n.sm {\n font-size: var(--font-size-xs);\n padding: 0.1rem var(--spacing-2);\n}\n\n.md {\n font-size: var(--font-size-xs);\n padding: var(--spacing-1) var(--spacing-3);\n}\n\n/* Variants */\n.default {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-600);\n}\n\n.primary {\n background-color: var(--color-primary-50);\n color: var(--color-primary-700);\n}\n\n.success {\n background-color: #f0fdf4;\n color: var(--color-success-600);\n}\n\n.warning {\n background-color: #fffbeb;\n color: var(--color-warning-600);\n}\n\n.danger {\n background-color: #fef2f2;\n color: var(--color-danger-600);\n}\n\n/* Dot indicator */\n.dotIndicator {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: var(--radius-full);\n background-color: currentColor;\n flex-shrink: 0;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIkJhZGdlLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ2pHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3Rva2Vucy5zY3NzXCI7XG5cbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IHZhcigtLXNwYWNpbmctMSk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4vKiBTaXplcyAqL1xuLnNtIHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBwYWRkaW5nOiAwLjFyZW0gdmFyKC0tc3BhY2luZy0yKTtcbn1cblxuLm1kIHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTEpIHZhcigtLXNwYWNpbmctMyk7XG59XG5cbi8qIFZhcmlhbnRzICovXG4uZGVmYXVsdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMTAwKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNjAwKTtcbn1cblxuLnByaW1hcnkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1wcmltYXJ5LTUwKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLXByaW1hcnktNzAwKTtcbn1cblxuLnN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmZGY0O1xuICBjb2xvcjogdmFyKC0tY29sb3Itc3VjY2Vzcy02MDApO1xufVxuXG4ud2FybmluZyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZWI7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci13YXJuaW5nLTYwMCk7XG59XG5cbi5kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmMmYyO1xuICBjb2xvcjogdmFyKC0tY29sb3ItZGFuZ2VyLTYwMCk7XG59XG5cbi8qIERvdCBpbmRpY2F0b3IgKi9cbi5kb3RJbmRpY2F0b3Ige1xuICB3aWR0aDogMC41cmVtO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuIl19 */","import React from \"react\";\nimport styles from \"./Badge.module.scss\";\n\nexport type BadgeVariant = \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\";\nexport type BadgeSize = \"sm\" | \"md\";\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n dot?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = \"default\",\n size = \"md\",\n dot = false,\n children,\n className,\n}) => {\n return (\n <span\n className={[\n styles.badge,\n styles[variant],\n styles[size],\n dot ? styles.dot : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {dot && <span className={styles.dotIndicator} aria-hidden=\"true\" />}\n {children}\n </span>\n );\n};\n","@charset \"UTF-8\";\n.wrapper {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n}\n\n/* Scie umide — sotto il contenuto */\n.trailCanvas {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n z-index: 1;\n pointer-events: none;\n}\n\n/* Form e contenuto — sopra le scie */\n.content {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Le gocce DOM stanno sopra tutto, ma pointer-events: none (impostato inline) */\n.dropContainer {\n position: absolute;\n inset: 0;\n z-index: 3;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJhaW5DYW52YXMubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7QUFDQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7QUFDQTtFQUNFO0VBQ0E7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi53cmFwcGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4vKiBTY2llIHVtaWRlIOKAlCBzb3R0byBpbCBjb250ZW51dG8gKi9cbi50cmFpbENhbnZhcyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB6LWluZGV4OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyogRm9ybSBlIGNvbnRlbnV0byDigJQgc29wcmEgbGUgc2NpZSAqL1xuLmNvbnRlbnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLyogTGUgZ29jY2UgRE9NIHN0YW5ubyBzb3ByYSB0dXR0bywgbWEgcG9pbnRlci1ldmVudHM6IG5vbmUgKGltcG9zdGF0byBpbmxpbmUpICovXG4uZHJvcENvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDM7XG59XG4iXX0= */","import React, { useEffect, useRef } from \"react\";\nimport styles from \"./RainCanvas.module.scss\";\n\n// --- Tipi ---\n\ninterface Drop {\n id: number;\n kind: \"static\" | \"sliding\";\n x: number;\n y: number;\n radius: number;\n age: number;\n maxAge: number;\n speed: number;\n trail: { x: number; y: number }[];\n}\n\n// --- Helpers ---\n\nlet _nextId = 0;\n\nfunction randomBetween(a: number, b: number) {\n return a + Math.random() * (b - a);\n}\n\nfunction createStaticDrop(width: number, height: number): Drop {\n return {\n id: _nextId++,\n kind: \"static\",\n x: randomBetween(10, width - 10),\n y: randomBetween(10, height - 10),\n radius: randomBetween(4, 11),\n age: 0,\n maxAge: randomBetween(120, 400),\n speed: 0,\n trail: [],\n };\n}\n\n// --- Componente ---\n\nexport interface RainCanvasProps {\n dropCount?: number;\n background?: string;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const RainCanvas: React.FC<RainCanvasProps> = ({\n dropCount = 55,\n background = \"linear-gradient(160deg, #0f172a 0%, #1e3a5f 60%, #0f2a4a 100%)\",\n children,\n className,\n style,\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const trailCanvasRef = useRef<HTMLCanvasElement>(null);\n const dropContainerRef = useRef<HTMLDivElement>(null);\n const dropsRef = useRef<Drop[]>([]);\n const nodeMapRef = useRef<Map<number, HTMLDivElement>>(new Map());\n const rafRef = useRef<number>(0);\n // Unique id per istanza per evitare conflitti se ci sono più RainCanvas nella pagina\n const filterIdRef = useRef(`rnf-${Math.random().toString(36).slice(2, 7)}`);\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n const trailCanvas = trailCanvasRef.current;\n const dropContainer = dropContainerRef.current;\n if (!wrapper || !trailCanvas || !dropContainer) return;\n\n const trailCtx = trailCanvas.getContext(\"2d\");\n if (!trailCtx) return;\n\n const filterId = filterIdRef.current;\n\n const resize = () => {\n const w = wrapper.offsetWidth;\n const h = wrapper.offsetHeight;\n trailCanvas.width = w;\n trailCanvas.height = h;\n dropsRef.current = Array.from({ length: dropCount }, () =>\n createStaticDrop(w, h)\n );\n };\n\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(wrapper);\n\n // Crea un nodo DOM per una goccia e lo aggiunge al container\n function getOrCreateNode(drop: Drop): HTMLDivElement {\n let node = nodeMapRef.current.get(drop.id);\n if (!node) {\n node = document.createElement(\"div\");\n // backdrop-filter: url(#id) applica il filtro SVG al contenuto DOM sottostante\n // Questo è ciò che crea la vera distorsione del contenuto reale\n node.style.cssText = `\n position: absolute;\n backdrop-filter: url(#${filterId}) brightness(1.12);\n -webkit-backdrop-filter: url(#${filterId}) brightness(1.12);\n box-shadow:\n inset 0 0 0 1px rgba(255,255,255,0.4),\n inset -2px -3px 6px rgba(255,255,255,0.18),\n inset 2px 2px 4px rgba(0, 40, 120, 0.15);\n background: radial-gradient(\n circle at 32% 30%,\n rgba(255,255,255,0.30) 0%,\n rgba(255,255,255,0.05) 45%,\n transparent 65%\n );\n pointer-events: none;\n will-change: transform;\n `;\n dropContainer!.appendChild(node);\n nodeMapRef.current.set(drop.id, node);\n }\n return node;\n }\n\n function removeNode(id: number) {\n const node = nodeMapRef.current.get(id);\n if (node) {\n node.remove();\n nodeMapRef.current.delete(id);\n }\n }\n\n function syncNode(drop: Drop) {\n const node = getOrCreateNode(drop);\n const isSliding = drop.kind === \"sliding\";\n const h = isSliding ? drop.radius * 2.4 : drop.radius * 2;\n const br = isSliding ? \"50% 50% 55% 55%\" : \"50%\";\n node.style.left = `${drop.x - drop.radius}px`;\n node.style.top = `${drop.y - drop.radius}px`;\n node.style.width = `${drop.radius * 2}px`;\n node.style.height = `${h}px`;\n node.style.borderRadius = br;\n }\n\n const tick = () => {\n const { width, height } = trailCanvas;\n\n // Fade della scia: riempiamo con un nero semi-trasparente ogni frame\n trailCtx.fillStyle = \"rgba(0,0,0,0.04)\";\n trailCtx.fillRect(0, 0, width, height);\n\n const next: Drop[] = [];\n\n for (const drop of dropsRef.current) {\n if (drop.kind === \"static\") {\n drop.age++;\n syncNode(drop);\n\n if (drop.age >= drop.maxAge) {\n // Diventa scorrevole: rimuovo il vecchio nodo e creo uno nuovo\n removeNode(drop.id);\n next.push({\n ...drop,\n id: _nextId++,\n kind: \"sliding\",\n speed: randomBetween(1.5, 3.5),\n trail: [],\n });\n } else {\n next.push(drop);\n }\n } else {\n // Aggiorna scia\n drop.trail.push({ x: drop.x, y: drop.y });\n if (drop.trail.length > 24) drop.trail.shift();\n\n // Disegna scia umida sul canvas\n if (drop.trail.length > 1) {\n trailCtx.beginPath();\n trailCtx.moveTo(drop.trail[0].x, drop.trail[0].y);\n for (let i = 1; i < drop.trail.length; i++) {\n trailCtx.lineTo(drop.trail[i].x, drop.trail[i].y);\n }\n trailCtx.strokeStyle = \"rgba(160, 200, 255, 0.18)\";\n trailCtx.lineWidth = drop.radius * 0.7;\n trailCtx.lineCap = \"round\";\n trailCtx.stroke();\n }\n\n drop.y += drop.speed;\n drop.speed += 0.06;\n syncNode(drop);\n\n if (drop.y - drop.radius > height) {\n removeNode(drop.id);\n next.push(createStaticDrop(width, height));\n } else {\n next.push(drop);\n }\n }\n }\n\n dropsRef.current = next;\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n\n return () => {\n cancelAnimationFrame(rafRef.current);\n ro.disconnect();\n // Pulizia nodi DOM\n nodeMapRef.current.forEach((node) => node.remove());\n nodeMapRef.current.clear();\n };\n }, [dropCount]);\n\n const filterId = filterIdRef.current;\n\n return (\n <div\n ref={wrapperRef}\n className={[styles.wrapper, className ?? \"\"].filter(Boolean).join(\" \")}\n style={{ background, ...style }}\n >\n {/*\n Definizione del filtro SVG:\n - feTurbulence genera rumore procedurale (pattern d'acqua)\n - feDisplacementMap usa quel rumore per spostare i pixel del backdrop\n L'animazione del seed fa \"muovere\" l'acqua nel tempo\n */}\n <svg width=\"0\" height=\"0\" style={{ position: \"absolute\" }}>\n <defs>\n <filter\n id={filterId}\n x=\"-20%\"\n y=\"-20%\"\n width=\"140%\"\n height=\"140%\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feTurbulence\n type=\"turbulence\"\n baseFrequency=\"0.07 0.04\"\n numOctaves=\"2\"\n result=\"noise\"\n >\n <animate\n attributeName=\"seed\"\n values=\"1;20;1\"\n dur=\"5s\"\n repeatCount=\"indefinite\"\n />\n </feTurbulence>\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"noise\"\n scale=\"22\"\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </defs>\n </svg>\n\n {/* Canvas per le scie umide (z-index basso) */}\n <canvas ref={trailCanvasRef} className={styles.trailCanvas} />\n\n {/* Contenuto (form, ecc.) */}\n <div className={styles.content}>{children}</div>\n\n {/* Container delle gocce DOM — sopra il contenuto, pointer-events none */}\n <div ref={dropContainerRef} className={styles.dropContainer} />\n </div>\n );\n};\n","@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.timeline {\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--font-family-base);\n}\n\n.vertical {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.vertical .item {\n display: grid;\n grid-template-columns: 1.25rem 1fr;\n column-gap: 1rem;\n align-items: stretch;\n}\n.vertical .track {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 1.25rem;\n}\n.vertical .connector {\n flex: 1;\n width: 0;\n min-height: 0.5rem;\n border-left: 2px dashed var(--color-neutral-200);\n transition: border-color 0.3s ease;\n}\n.vertical .content {\n padding-bottom: 1.75rem;\n padding-top: 0.1rem;\n}\n.vertical .item.last .content {\n padding-bottom: 0;\n}\n\n.horizontal {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n}\n.horizontal .item {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n min-width: 0;\n}\n.horizontal .track {\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 100%;\n}\n.horizontal .connector {\n flex: 1;\n height: 0;\n min-width: 1rem;\n border-top: 2px dashed var(--color-neutral-200);\n transition: border-color 0.3s ease;\n}\n.horizontal .content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding-top: 0.75rem;\n padding-inline: 0.5rem;\n}\n\n.dot {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.6rem;\n position: relative;\n z-index: 1;\n transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;\n background-color: var(--color-neutral-0);\n border: 2px solid var(--color-neutral-200);\n color: var(--color-neutral-400);\n}\n\n.iconSlot {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n line-height: 1;\n}\n\n.completed .dot {\n background-color: var(--timeline-accent-dot, var(--accent-dot));\n border-color: var(--timeline-accent-dot, var(--accent-dot));\n color: var(--color-neutral-0);\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n animation: dotIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation-delay: var(--dot-delay, 0s);\n}\n\n.active .dot {\n background-color: var(--color-neutral-0);\n border-color: var(--timeline-accent-track, var(--accent-track));\n border-width: 2px;\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n animation: pulse 2s ease-in-out infinite;\n}\n\n.pending .dot {\n box-shadow: 0 0 0 3px var(--color-neutral-200);\n}\n\n.label {\n display: block;\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n margin-bottom: 0.2rem;\n letter-spacing: 0.01em;\n}\n\n.title {\n display: block;\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-neutral-900);\n letter-spacing: -0.01em;\n}\n\n.description {\n margin: 0.35rem 0 0;\n font-size: var(--font-size-xs);\n color: var(--color-neutral-600);\n line-height: 1.5;\n}\n\n.pending .title {\n color: var(--color-neutral-400);\n font-weight: 500;\n}\n\n.connectorHidden {\n border-color: transparent !important;\n}\n\n.connectorDone {\n border-color: var(--timeline-accent-track, var(--accent-track)) !important;\n border-style: solid !important;\n}\n\n@keyframes dotIn {\n 0% {\n transform: scale(0.5);\n background-color: var(--color-neutral-0);\n border-color: var(--color-neutral-200);\n box-shadow: 0 0 0 3px var(--color-neutral-200);\n color: transparent;\n }\n 40% {\n background-color: var(--timeline-accent-dot, var(--accent-dot));\n border-color: var(--timeline-accent-dot, var(--accent-dot));\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n color: var(--color-neutral-0);\n }\n 50% {\n transform: scale(1.06);\n }\n 70% {\n transform: scale(0.97);\n }\n 85% {\n transform: scale(1.02);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes pulse {\n 0%, 100% {\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n }\n 50% {\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring)), 0 0 0 6px var(--timeline-accent-glow, var(--accent-glow));\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlRpbWVsaW5lLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ3JGRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFNRjtFQUNFO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsT0FwQ087O0FBdUNUO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBT0o7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPSjtFQUNFLE9BekdTO0VBMEdULFFBMUdTO0VBMkdUO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPQTtFQUNFLGtCQXBJVztFQXFJWCxjQXJJVztFQXNJWDtFQUNBO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRTtFQUNBLGNBL0lXO0VBZ0pYO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRTs7O0FBT0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTs7O0FBSUY7RUFDRTs7O0FBSUY7RUFDRTtFQUNBOzs7QUFNRjtFQUNFO0lBQ0U7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7RUFFRjtJQUNFLGtCQXBOVztJQXFOWCxjQXJOVztJQXNOWDtJQUNBOztFQUVGO0lBQU87O0VBQ1A7SUFBTzs7RUFDUDtJQUFPOztFQUNQO0lBQU87OztBQUdUO0VBQ0U7SUFBVzs7RUFDWDtJQUFZIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAdXNlIFwiLi4vLi4vc3R5bGVzL3Rva2Vuc1wiIGFzICo7XG5cbi8vIC0tLSBUb2tlbnMgbG9jYWxpIC0tLVxuLy8gVXNhIC0tdGltZWxpbmUtYWNjZW50LSogc2UgcGFzc2F0byB2aWEgcHJvcCwgYWx0cmltZW50aSBmYWxsYmFjayBhaSB0b2tlbiBnbG9iYWxpXG4kZG90LXNpemU6IDEuMjVyZW07XG4kY29ubmVjdG9yLXRoaWNrbmVzczogMnB4O1xuJGNvbG9yLXBlbmRpbmc6IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcblxuJGFjY2VudC1kb3Q6ICAgdmFyKC0tdGltZWxpbmUtYWNjZW50LWRvdCwgICB2YXIoLS1hY2NlbnQtZG90KSk7XG4kYWNjZW50LXRyYWNrOiB2YXIoLS10aW1lbGluZS1hY2NlbnQtdHJhY2ssIHZhcigtLWFjY2VudC10cmFjaykpO1xuJGFjY2VudC1yaW5nOiAgdmFyKC0tdGltZWxpbmUtYWNjZW50LXJpbmcsICB2YXIoLS1hY2NlbnQtcmluZykpO1xuJGFjY2VudC1nbG93OiAgdmFyKC0tdGltZWxpbmUtYWNjZW50LWdsb3csICB2YXIoLS1hY2NlbnQtZ2xvdykpO1xuXG4vLyAtLS0gUmVzZXQgbGlzdGEgLS0tXG4udGltZWxpbmUge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09XG4vLyBWRVJUSUNBTEUgKGRlZmF1bHQpXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbi52ZXJ0aWNhbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMDtcblxuICAuaXRlbSB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6ICRkb3Qtc2l6ZSAxZnI7XG4gICAgY29sdW1uLWdhcDogMXJlbTtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgfVxuXG4gIC50cmFjayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6ICRkb3Qtc2l6ZTtcbiAgfVxuXG4gIC5jb25uZWN0b3Ige1xuICAgIGZsZXg6IDE7XG4gICAgd2lkdGg6IDA7XG4gICAgbWluLWhlaWdodDogMC41cmVtO1xuICAgIGJvcmRlci1sZWZ0OiAkY29ubmVjdG9yLXRoaWNrbmVzcyBkYXNoZWQgJGNvbG9yLXBlbmRpbmc7XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3MgZWFzZTtcbiAgfVxuXG4gIC5jb250ZW50IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMS43NXJlbTtcbiAgICBwYWRkaW5nLXRvcDogMC4xcmVtO1xuICB9XG5cbiAgLml0ZW0ubGFzdCAuY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9SSVpaT05UQUxFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PVxuLmhvcml6b250YWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxuICAuaXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogMTtcbiAgICBtaW4td2lkdGg6IDA7XG5cbiAgfVxuXG4gIC50cmFjayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuY29ubmVjdG9yIHtcbiAgICBmbGV4OiAxO1xuICAgIGhlaWdodDogMDtcbiAgICBtaW4td2lkdGg6IDFyZW07XG4gICAgYm9yZGVyLXRvcDogJGNvbm5lY3Rvci10aGlja25lc3MgZGFzaGVkICRjb2xvci1wZW5kaW5nO1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzIGVhc2U7XG4gIH1cblxuXG5cbiAgLmNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgICBwYWRkaW5nLWlubGluZTogMC41cmVtO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9UXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbi5kb3Qge1xuICB3aWR0aDogJGRvdC1zaXplO1xuICBoZWlnaHQ6ICRkb3Qtc2l6ZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBmbGV4LXNocmluazogMDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC42cmVtO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLCBib3JkZXItY29sb3IgMC4ycyBlYXNlLCBib3gtc2hhZG93IDAuMnMgZWFzZTtcblxuICAvLyBwZW5kaW5nXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMCk7XG4gIGJvcmRlcjogJGNvbm5lY3Rvci10aGlja25lc3Mgc29saWQgJGNvbG9yLXBlbmRpbmc7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG59XG5cbi5pY29uU2xvdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBmb250LXNpemU6IDAuNjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbi8vIFNUQVRVU1xuLy8gPT09PT09PT09PT09PT09PT09PT09XG4uY29tcGxldGVkIHtcbiAgLmRvdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGFjY2VudC1kb3Q7XG4gICAgYm9yZGVyLWNvbG9yOiAkYWNjZW50LWRvdDtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJGFjY2VudC1yaW5nO1xuICAgIGFuaW1hdGlvbjogZG90SW4gMC40cyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSkgYm90aDtcbiAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWRvdC1kZWxheSwgMHMpO1xuICB9XG59XG5cbi5hY3RpdmUge1xuICAuZG90IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTApO1xuICAgIGJvcmRlci1jb2xvcjogJGFjY2VudC10cmFjaztcbiAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJGFjY2VudC1yaW5nO1xuICAgIGFuaW1hdGlvbjogcHVsc2UgMnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gIH1cbn1cblxuLnBlbmRpbmcge1xuICAuZG90IHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY29sb3ItbmV1dHJhbC0yMDApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09OVEVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09XG4ubGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC00MDApO1xuICBtYXJnaW4tYm90dG9tOiAwLjJyZW07XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG59XG5cbi50aXRsZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS1zbSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTkwMCk7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xufVxuXG4uZGVzY3JpcHRpb24ge1xuICBtYXJnaW46IDAuMzVyZW0gMCAwO1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS14cyk7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTYwMCk7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG59XG5cbi8vIFN0YXR1czogdGl0b2xvIHBpw7kgc2JpYWRpdG8gcGVyIHBlbmRpbmdcbi5wZW5kaW5nIC50aXRsZSB7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi8vIENvbm5ldHRvcmUgaW52aXNpYmlsZSDigJQgdGllbmUgbG8gc3BhemlvIG1hIG5vbiBtb3N0cmEgbGEgbGluZWFcbi5jb25uZWN0b3JIaWRkZW4ge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG59XG5cbi8vIENvbm5ldHRvcmUgY29tcGxldGF0byDigJQgc292cmFzY3JpdmUgZGFzaGVkIGNvbiBzb2xpZCArIGNvbG9yZSBhY2NlbnRcbi5jb25uZWN0b3JEb25lIHtcbiAgYm9yZGVyLWNvbG9yOiAkYWNjZW50LXRyYWNrICFpbXBvcnRhbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQgIWltcG9ydGFudDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09XG4vLyBBTklNQVpJT05JXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbkBrZXlmcmFtZXMgZG90SW4ge1xuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMCk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgNDAlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYWNjZW50LWRvdDtcbiAgICBib3JkZXItY29sb3I6ICRhY2NlbnQtZG90O1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAkYWNjZW50LXJpbmc7XG4gICAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMCk7XG4gIH1cbiAgNTAlICB7IHRyYW5zZm9ybTogc2NhbGUoMS4wNik7IH1cbiAgNzAlICB7IHRyYW5zZm9ybTogc2NhbGUoMC45Nyk7IH1cbiAgODUlICB7IHRyYW5zZm9ybTogc2NhbGUoMS4wMik7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cbn1cblxuQGtleWZyYW1lcyBwdWxzZSB7XG4gIDAlLCAxMDAlIHsgYm94LXNoYWRvdzogMCAwIDAgM3B4ICRhY2NlbnQtcmluZzsgfVxuICA1MCUgICAgICAgeyBib3gtc2hhZG93OiAwIDAgMCAzcHggJGFjY2VudC1yaW5nLCAwIDAgMCA2cHggJGFjY2VudC1nbG93OyB9XG59XG4iXX0= */","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 from \"react\";\nimport styles from \"./Timeline.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport type TimelineStatus = \"completed\" | \"active\" | \"pending\";\nexport type TimelineOrientation = \"vertical\" | \"horizontal\";\n\nexport interface TimelineItem {\n id: string | number;\n title: string;\n description?: string;\n label?: string;\n status?: TimelineStatus;\n icon?: React.ReactNode;\n}\n\nexport interface TimelineProps {\n items: TimelineItem[];\n orientation?: TimelineOrientation;\n /** Colore accent custom — sovrascrive il tema globale per questa istanza */\n accent?: string;\n className?: string;\n}\n\nconst CheckIcon = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M1.5 5L4 7.5L8.5 2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n orientation = \"vertical\",\n accent,\n className,\n}) => {\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"timeline\")\n : {};\n\n return (\n <ol\n className={[\n styles.timeline,\n styles[orientation],\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={accentVars as React.CSSProperties}\n >\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const isLast = index === items.length - 1;\n\n return (\n <li\n key={item.id}\n className={[styles.item, styles[status], isLast ? styles.last : \"\"]\n .filter(Boolean)\n .join(\" \")}\n style={{ \"--dot-delay\": `${index * 0.08}s` } as React.CSSProperties}\n >\n {/* Colonna sinistra (verticale) o riga superiore (orizzontale): dot + connettore */}\n <div className={styles.track}>\n {/* Connettore sinistro — orizzontale: sempre, invisibile sul primo */}\n {orientation === \"horizontal\" && (\n <div className={[\n styles.connector,\n index === 0 ? styles.connectorHidden : \"\",\n index > 0 && items[index - 1].status === \"completed\" ? styles.connectorDone : \"\",\n ].filter(Boolean).join(\" \")} />\n )}\n\n <div className={styles.dot}>\n {status === \"completed\" && (\n item.icon\n ? <span className={styles.iconSlot}>{item.icon}</span>\n : <CheckIcon />\n )}\n </div>\n\n {/* Connettore destro — verticale: non sull'ultimo; orizzontale: sempre, invisibile sull'ultimo */}\n {(orientation === \"horizontal\" || !isLast) && (\n <div className={[\n styles.connector,\n orientation === \"horizontal\" && isLast ? styles.connectorHidden : \"\",\n status === \"completed\" ? styles.connectorDone : \"\",\n ].filter(Boolean).join(\" \")} />\n )}\n </div>\n\n {/* Contenuto */}\n <div className={styles.content}>\n {item.label && (\n <span className={styles.label}>{item.label}</span>\n )}\n <span className={styles.title}>{item.title}</span>\n {item.description && (\n <p className={styles.description}>{item.description}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n","@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.colorPicker[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 --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.colorPicker {\n display: inline-flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n background: var(--color-surface);\n backdrop-filter: blur(16px);\n -webkit-backdrop-filter: blur(16px);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md), 0 0 0 1px rgba(0, 0, 0, 0.04);\n font-family: var(--font-family-base);\n width: calc(200px + 2rem);\n box-sizing: border-box;\n user-select: none;\n}\n\n.topRow {\n display: flex;\n justify-content: center;\n}\n\n.discWrapper {\n position: relative;\n width: 200px;\n height: 200px;\n flex-shrink: 0;\n border-radius: 50%;\n box-shadow: 0 0 0 1.5px var(--color-neutral-200);\n}\n\n.disc {\n display: block;\n width: 200px;\n height: 200px;\n cursor: crosshair;\n border-radius: 50%;\n}\n\n.dot {\n position: absolute;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.2), 0 2px 4px rgba(0, 0, 0, 0.2);\n background: transparent;\n}\n\n.previewSwatch {\n width: 100%;\n height: 48px;\n border-radius: var(--radius-md);\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\n position: relative;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0 0.5rem;\n box-sizing: border-box;\n}\n\n.eyedropperBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--radius-sm);\n background: rgba(255, 255, 255, 0.15);\n cursor: pointer;\n backdrop-filter: blur(4px);\n transition: background var(--transition-fast);\n}\n.eyedropperBtn:hover {\n background: rgba(255, 255, 255, 0.4);\n}\n\n.inputSection {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.tabs {\n display: flex;\n background: var(--color-neutral-100);\n border-radius: var(--radius-sm);\n padding: 2px;\n gap: 2px;\n}\n\n.tab {\n flex: 1;\n padding: 0.2rem 0;\n font-size: 0.65rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n border: none;\n border-radius: calc(var(--radius-sm) - 1px);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n}\n.tab:hover:not(.tabActive) {\n color: var(--color-neutral-600);\n}\n\n.tabActive {\n background: var(--colorpicker-accent, var(--accent));\n color: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n.inputWrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.inputAddon {\n position: absolute;\n left: 0.5rem;\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-400);\n pointer-events: none;\n line-height: 1;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n padding: 0.4rem 2rem;\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-900);\n background: var(--color-neutral-0);\n outline: none;\n text-align: center;\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n.input:focus {\n border-color: var(--colorpicker-accent, var(--accent));\n box-shadow: 0 0 0 2px var(--colorpicker-accent-glow, var(--accent-glow));\n}\n\n.inputCopyBtn {\n position: absolute;\n right: 0.35rem;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n}\n.inputCopyBtn:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.recents {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-top: 0.25rem;\n border-top: 1px solid var(--color-neutral-100);\n overflow: hidden;\n}\n\n.recentsLabel {\n font-size: 0.6rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n}\n\n.swatches {\n display: flex;\n gap: 0.35rem;\n flex-wrap: nowrap;\n overflow: hidden;\n}\n\n.recentSwatch {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 1.5px solid rgba(0, 0, 0, 0.1);\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIkNvbG9yUGlja2VyLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ3BGRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFLRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQSxPQWhESztFQWlETCxRQWpESztFQWtETDtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQSxPQXpESztFQTBETCxRQTFESztFQTJETDtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBTUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7OztBQUlKO0VBQ0UsWUF0SmE7RUF1SmI7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0UsY0ExTFc7RUEyTFg7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOzs7QUFPSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlIFwic2Fzczpjb2xvclwiO1xuXG5AaW1wb3J0IHVybChcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXBcIik7XG5cbi8vIEFjY2VudCBkaSBkZWZhdWx0IOKAlCBjYW1iaWEgcXVpIHBlciBhZ2dpb3JuYXJlIHR1dHRhIGxhIGxpYnJlcmlhXG4kYWNjZW50OiAjM2I4MmY2O1xuXG46cm9vdCB7XG4gIC8vIEFjY2VudCBzY2FsZSDigJQgZGVyaXZhdGEgZGEgJGFjY2VudCBhIGNvbXBpbGUgdGltZVxuICAtLWFjY2VudDogICAgICAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWRvdDogICAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAxMiUpfTtcbiAgLS1hY2NlbnQtdHJhY2s6ICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1yaW5nOiAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWdsb3c6ICAgI3tjb2xvci5jaGFuZ2UoJGFjY2VudCwgJGFscGhhOiAwLjMpfTtcbiAgLS1hY2NlbnQtbGlnaHQ6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ1JSwgJHNhdHVyYXRpb246IC0yMCUpfTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIChtYW50ZW51dGEgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AgY29uIEJ1dHRvbiwgQmFkZ2UsIElucHV0KVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ5JSwgJHNhdHVyYXRpb246IC0zMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTEwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0MiUsICRzYXR1cmF0aW9uOiAtMTUlKX07XG4gIC0tY29sb3ItcHJpbWFyeS00MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tY29sb3ItcHJpbWFyeS01MDA6ICN7JGFjY2VudH07XG4gIC0tY29sb3ItcHJpbWFyeS02MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogLTEwJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNzAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0yMCUpfTtcblxuICAvLyBOZXV0cmFsXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICNmZmZmZmY7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICNmM2Y0ZjY7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICNlNWU3ZWI7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5Y2EzYWY7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICM0YjU1NjM7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICMxMTE4Mjc7XG5cbiAgLy8gU2VtYW50aWNcbiAgLS1jb2xvci1zdWNjZXNzLTUwMDogIzIyYzU1ZTtcbiAgLS1jb2xvci1zdWNjZXNzLTYwMDogIzE2YTM0YTtcbiAgLS1jb2xvci1kYW5nZXItNTAwOiAgI2VmNDQ0NDtcbiAgLS1jb2xvci1kYW5nZXItNjAwOiAgI2RjMjYyNjtcbiAgLS1jb2xvci13YXJuaW5nLTUwMDogI2Y1OWUwYjtcbiAgLS1jb2xvci13YXJuaW5nLTYwMDogI2Q5NzcwNjtcblxuICAvLyBUeXBvZ3JhcGh5XG4gIC0tZm9udC1mYW1pbHktYmFzZTogXCJJbnRlclwiLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWY7XG4gIC0tZm9udC1zaXplLXhzOiAwLjc1cmVtO1xuICAtLWZvbnQtc2l6ZS1zbTogMC44NzVyZW07XG4gIC0tZm9udC1zaXplLW1kOiAxcmVtO1xuICAtLWZvbnQtc2l6ZS1sZzogMS4xMjVyZW07XG5cbiAgLy8gU3BhY2luZ1xuICAtLXNwYWNpbmctMTogMC4yNXJlbTtcbiAgLS1zcGFjaW5nLTI6IDAuNXJlbTtcbiAgLS1zcGFjaW5nLTM6IDAuNzVyZW07XG4gIC0tc3BhY2luZy00OiAxcmVtO1xuXG4gIC8vIFJhZGl1c1xuICAtLXJhZGl1cy1zbTogICAwLjI1cmVtO1xuICAtLXJhZGl1cy1tZDogICAwLjM3NXJlbTtcbiAgLS1yYWRpdXMtbGc6ICAgMC41cmVtO1xuICAtLXJhZGl1cy1mdWxsOiA5OTk5cHg7XG5cbiAgLy8gU2hhZG93c1xuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7XG4gIC0tc2hhZG93LW1kOiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuXG4gIC8vIFRyYW5zaXRpb25zXG4gIC0tdHJhbnNpdGlvbi1mYXN0OiAxNTBtcyBlYXNlO1xuXG4gIC8vIFN1cmZhY2UgKGJhY2tncm91bmQgZGkgY2FyZC9wYW5lbClcbiAgLS1jb2xvci1zdXJmYWNlOiAgICAgICAgICAjZmZmZmZmO1xuICAtLWNvbG9yLXN1cmZhY2UtZWxldmF0ZWQ6ICNmZmZmZmY7XG59XG5cbi8vIOKUgOKUgOKUgCBEYXJrIHRoZW1lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXBwbGljYXRvIHZpYSBkYXRhLXRoZW1lPVwiZGFya1wiIHN1bGwnZWxlbWVudG8gcm9vdCAoZ2VzdGl0byBkYSBTdG9yeWJvb2sgZGVjb3JhdG9yXG4vLyBlIGRhbGwnYXBwIGNvbnN1bWVyKS4gSSBjb21wb25lbnRpIG5vbiBkZXZvbm8gZmFyZSBudWxsYSBkaSBzcGVjaWFsZTogYmFzdGEgY2hlXG4vLyB1c2lubyBpIHRva2VuIHZhcigpIGUgcmljZXZlcmFubm8gYXV0b21hdGljYW1lbnRlIGkgdmFsb3JpIGRhcmsuXG5cbltkYXRhLXRoZW1lPVwiZGFya1wiXSB7XG4gIC8vIE5ldXRyYWwgKHNjYWxhIGludmVydGl0YSlcbiAgLS1jb2xvci1uZXV0cmFsLTA6ICAgIzBmMTcyYTtcbiAgLS1jb2xvci1uZXV0cmFsLTEwMDogIzFlMjkzYjtcbiAgLS1jb2xvci1uZXV0cmFsLTIwMDogIzMzNDE1NTtcbiAgLS1jb2xvci1uZXV0cmFsLTQwMDogIzk0YTNiODtcbiAgLS1jb2xvci1uZXV0cmFsLTYwMDogI2NiZDVlMTtcbiAgLS1jb2xvci1uZXV0cmFsLTkwMDogI2Y4ZmFmYztcblxuICAvLyBTdXJmYWNlXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgIzFlMjkzYjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjMjczNTQ5O1xuXG4gIC8vIFByaW1hcnkgc2NhbGUgZGFyayAocGVyIGlsIGRlZmF1bHQgYWNjZW50IGJsdSDigJQgbGUgc2Z1bWF0dXJlIGNoaWFyZSBkaXZlbnRhbm8gc2N1cmUpXG4gIC0tY29sb3ItcHJpbWFyeS01MDogICMxNzI1NTQ7XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICMxZTNhOGE7XG4gIC8vIDQwMCAvIDUwMCAvIDYwMCAvIDcwMCByaW1hbmdvbm8gaW52YXJpYXRpIChhYmJhc3RhbnphIHNhdHVyaSBzdSBiZyBzY3VybylcblxuICAvLyBBY2NlbnQgbGlnaHQ6IHZhcmlhbnRlIHNjdXJhXG4gIC0tYWNjZW50LWxpZ2h0OiAjMTcyNTU0O1xuXG4gIC8vIFNoYWRvd3MgKHBpw7kgZm9ydGkgc3UgYmcgc2N1cm8pXG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjQpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC41KSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC40KTtcbn1cbiIsIkB1c2UgXCIuLi8uLi9zdHlsZXMvdG9rZW5zXCIgYXMgKjtcblxuJGFjY2VudC1iYXNlOiAgdmFyKC0tY29sb3JwaWNrZXItYWNjZW50LCAgICAgICB2YXIoLS1hY2NlbnQpKTtcbiRhY2NlbnQtcmluZzogIHZhcigtLWNvbG9ycGlja2VyLWFjY2VudC1yaW5nLCAgdmFyKC0tYWNjZW50LXJpbmcpKTtcbiRhY2NlbnQtZ2xvdzogIHZhcigtLWNvbG9ycGlja2VyLWFjY2VudC1nbG93LCAgdmFyKC0tYWNjZW50LWdsb3cpKTtcbiRhY2NlbnQtbGlnaHQ6IHZhcigtLWNvbG9ycGlja2VyLWFjY2VudC1saWdodCwgdmFyKC0tYWNjZW50LWxpZ2h0KSk7XG5cbiRkaXNjOiAyMDBweDtcbiRzbGlkZXItdzogMjBweDtcbiR0aHVtYi1zaXplOiAyMHB4O1xuJGdhcDogMC41cmVtO1xuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSBzY29wZWQgc3VsbCdlbGVtZW50byAocHJvcCB0aGVtZT1cImRhcmtcIikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTb3ZyYXNjcml2ZSBpIHRva2VuIGdsb2JhbGkgbG9jYWxtZW50ZSDigJQgbm9uIGRpcGVuZGUgZGFsIGRhdGEtdGhlbWUgZGVsbCdhcHAuXG5cbi5jb2xvclBpY2tlcltkYXRhLXRoZW1lPVwiZGFya1wiXSB7XG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG4gIC0tY29sb3Itc3VyZmFjZTogICAgICMxZTI5M2I7XG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjQpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC41KSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC40KTtcbn1cblxuLy8g4pSA4pSA4pSAIENhcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5jb2xvclBpY2tlciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDAuNzVyZW07XG4gIHBhZGRpbmc6IDFyZW07XG4gIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLXN1cmZhY2UpO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTZweCk7XG4gIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDE2cHgpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7XG4gIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1tZCksIDAgMCAwIDFweCByZ2JhKDAsMCwwLDAuMDQpO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIHdpZHRoOiBjYWxjKCN7JGRpc2N9ICsgMnJlbSk7IC8vIGRpc2MgKyBjYXJkIHBhZGRpbmcgKDFyZW0gw5cgMiBzaWRlcylcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi8vIOKUgOKUgOKUgCBEaXNjICsgTCBzbGlkZXIgcm93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4udG9wUm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5kaXNjV3JhcHBlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6ICRkaXNjO1xuICBoZWlnaHQ6ICRkaXNjO1xuICBmbGV4LXNocmluazogMDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3gtc2hhZG93OiAwIDAgMCAxLjVweCB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG59XG5cbi5kaXNjIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAkZGlzYztcbiAgaGVpZ2h0OiAkZGlzYztcbiAgY3Vyc29yOiBjcm9zc2hhaXI7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cblxuLmRvdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDE0cHg7XG4gIGhlaWdodDogMTRweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDJweCBzb2xpZDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBib3gtc2hhZG93OiAwIDAgMCAxLjVweCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG5cbi8vIOKUgOKUgOKUgCBQcmV2aWV3IHN3YXRjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLnByZXZpZXdTd2F0Y2gge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA0OHB4O1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgcGFkZGluZzogMCAwLjVyZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5leWVkcm9wcGVyQnRuIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAyOHB4O1xuICBoZWlnaHQ6IDI4cHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS10cmFuc2l0aW9uLWZhc3QpO1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgSW5wdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4uaW5wdXRTZWN0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAwLjVyZW07XG59XG5cbi50YWJzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItbmV1dHJhbC0xMDApO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pO1xuICBwYWRkaW5nOiAycHg7XG4gIGdhcDogMnB4O1xufVxuXG4udGFiIHtcbiAgZmxleDogMTtcbiAgcGFkZGluZzogMC4ycmVtIDA7XG4gIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLXJhZGl1cy1zbSkgLSAxcHgpO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIHZhcigtLXRyYW5zaXRpb24tZmFzdCksIGNvbG9yIHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG5cbiAgJjpob3Zlcjpub3QoLnRhYkFjdGl2ZSkge1xuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTYwMCk7XG4gIH1cbn1cblxuLnRhYkFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6ICRhY2NlbnQtYmFzZTtcbiAgY29sb3I6ICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4uaW5wdXRXcmFwcGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uaW5wdXRBZGRvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMC41cmVtO1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS14cyk7XG4gIGZvbnQtZmFtaWx5OiBcIlNGIE1vbm9cIiwgXCJGaXJhIENvZGVcIiwgXCJDb25zb2xhc1wiLCBtb25vc3BhY2U7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBsaW5lLWhlaWdodDogMTtcbn1cblxuLmlucHV0IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDAuNHJlbSAycmVtOyAvLyBzeW1tZXRyaWM6IHJvb20gZm9yICMgb24gbGVmdCBhbmQgY29weSBpY29uIG9uIHJpZ2h0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBmb250LWZhbWlseTogXCJTRiBNb25vXCIsIFwiRmlyYSBDb2RlXCIsIFwiQ29uc29sYXNcIiwgbW9ub3NwYWNlO1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1uZXV0cmFsLTApO1xuICBvdXRsaW5lOiBub25lO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS10cmFuc2l0aW9uLWZhc3QpLCBib3gtc2hhZG93IHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG5cbiAgJjpmb2N1cyB7XG4gICAgYm9yZGVyLWNvbG9yOiAkYWNjZW50LWJhc2U7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICRhY2NlbnQtZ2xvdztcbiAgfVxufVxuXG4uaW5wdXRDb3B5QnRuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMC4zNXJlbTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS10cmFuc2l0aW9uLWZhc3QpLCBjb2xvciB2YXIoLS10cmFuc2l0aW9uLWZhc3QpO1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW5ldXRyYWwtMTAwKTtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICB9XG59XG5cblxuLy8g4pSA4pSA4pSAIFJlY2VudCBjb2xvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5yZWNlbnRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tY29sb3ItbmV1dHJhbC0xMDApO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVjZW50c0xhYmVsIHtcbiAgZm9udC1zaXplOiAwLjZyZW07XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uc3dhdGNoZXMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDAuMzVyZW07XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVjZW50U3dhdGNoIHtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDEuNXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAwO1xuICBmbGV4LXNocmluazogMDtcbn1cbiJdfQ== */","@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 */","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","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styles from \"./ColorPicker.module.scss\";\nimport { SliderControl } from \"../SliderControl\";\nimport {\n accentToCssVars,\n buildColorValue,\n deriveAccent,\n hexToHsl,\n hslToHex,\n hslToRgb,\n rgbToHsl,\n} from \"../../utils/color\";\nimport type { ColorValue } from \"../../utils/color\";\n\ndeclare global {\n interface Window {\n EyeDropper?: new () => { open(): Promise<{ sRGBHex: string }> };\n }\n}\n\nconst DISC = 200;\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst CopyIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"5\" y=\"5\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"M2 9V2.5A.5.5 0 0 1 2.5 2H9\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.5 7L5.5 10L11.5 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst EyedropperIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.5 2.5L11.5 4.5L6 10L3 11L4 8L9.5 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\" />\n <path d=\"M8 4L10 6\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"2.5\" cy=\"11.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n);\n\n// ─── Input sub-component ──────────────────────────────────────────────────────\n\ntype InputMode = \"hex\" | \"hsl\" | \"rgb\";\n\ninterface ColorInputProps {\n mode: InputMode;\n h: number; s: number; l: number;\n r: number; g: number; b: number;\n hex: string;\n onChange: (h: number, s: number, l: number) => void;\n onCopy: () => void;\n copied: boolean;\n}\n\nfunction formatValue(mode: InputMode, h: number, s: number, l: number, r: number, g: number, b: number, hex: string): string {\n if (mode === \"hex\") return hex.replace(\"#\", \"\");\n if (mode === \"hsl\") return `${Math.round(h)} ${Math.round(s)} ${Math.round(l)}`;\n return `${r} ${g} ${b}`;\n}\n\nfunction parseValue(mode: InputMode, raw: string): [number, number, number] | null {\n if (mode === \"hex\") {\n const clean = raw.replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(clean)) return null;\n const [h, s, l] = hexToHsl(`#${clean}`);\n return [h, s, l];\n }\n const parts = raw.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 3 || parts.some(isNaN)) return null;\n if (mode === \"hsl\") {\n const [h, s, l] = parts;\n if (h < 0 || h > 360 || s < 0 || s > 100 || l < 0 || l > 100) return null;\n return [h, s, l];\n }\n // rgb\n const [r, g, b] = parts;\n if ([r, g, b].some((v) => v < 0 || v > 255)) return null;\n return rgbToHsl(r, g, b);\n}\n\nconst ColorInput: React.FC<ColorInputProps> = ({ mode, h, s, l, r, g, b, hex, onChange, onCopy, copied }) => {\n const [draft, setDraft] = useState(() => formatValue(mode, h, s, l, r, g, b, hex));\n const [focused, setFocused] = useState(false);\n\n // sync from outside only when not focused\n useEffect(() => {\n if (!focused) setDraft(formatValue(mode, h, s, l, r, g, b, hex));\n }, [focused, mode, h, s, l, r, g, b, hex]);\n\n const placeholder = mode === \"hex\" ? \"3b82f6\" : mode === \"hsl\" ? \"217 91 60\" : \"59 130 246\";\n\n return (\n <div className={styles.inputWrapper}>\n {mode === \"hex\" && <span className={styles.inputAddon}>#</span>}\n <input\n className={styles.input}\n value={draft}\n placeholder={placeholder}\n spellCheck={false}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onChange={(e) => {\n const raw = e.target.value;\n setDraft(raw);\n const result = parseValue(mode, raw);\n if (result) onChange(...result);\n }}\n />\n <button className={styles.inputCopyBtn} onClick={onCopy} tabIndex={-1} title=\"Copia\">\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </div>\n );\n};\n\n// ─── Main component ────────────────────────────────────────────────────────────\n\nexport interface ColorPickerProps {\n value?: string;\n onChange?: (color: ColorValue) => void;\n showAlpha?: boolean;\n recentColors?: string[];\n accent?: string;\n className?: string;\n theme?: \"light\" | \"dark\";\n}\n\nfunction parseInitial(value?: string): [number, number, number, number] {\n if (value?.startsWith(\"#\")) {\n const [h, s, l] = hexToHsl(value);\n return [h, s, l, 1];\n }\n return [217, 91, 60, 1];\n}\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n onChange,\n showAlpha = true,\n recentColors = [],\n accent,\n className,\n theme,\n}) => {\n const init = parseInitial(value);\n const [h, setH] = useState(init[0]);\n const [s, setS] = useState(init[1]);\n const [l, setL] = useState(init[2]);\n const [a, setA] = useState(init[3]);\n const [mode, setMode] = useState<\"hex\" | \"hsl\" | \"rgb\">(\"hex\");\n const [copied, setCopied] = useState(false);\n const [hasEyeDropper, setHasEyeDropper] = useState(false);\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n setHasEyeDropper(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n }, []);\n\n // Sync from value prop (controlled)\n useEffect(() => {\n if (value?.startsWith(\"#\")) {\n const [nh, ns, nl] = hexToHsl(value);\n setH(nh); setS(ns); setL(nl);\n }\n }, [value]);\n\n // Render disc canvas via ImageData\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n const img = ctx.createImageData(DISC, DISC);\n const data = img.data;\n const cx = DISC / 2;\n const cy = DISC / 2;\n const radius = DISC / 2;\n\n for (let py = 0; py < DISC; py++) {\n for (let px = 0; px < DISC; px++) {\n const dx = px - cx;\n const dy = py - cy;\n const r = Math.sqrt(dx * dx + dy * dy);\n const idx = (py * DISC + px) * 4;\n if (r > radius) { data[idx + 3] = 0; continue; }\n const theta = (Math.atan2(dy, dx) * 180) / Math.PI;\n const hue = (theta + 360) % 360;\n const sat = (r / radius) * 100;\n const { r: rr, g: gg, b: bb } = hslToRgb(hue, sat, l);\n data[idx] = rr;\n data[idx + 1] = gg;\n data[idx + 2] = bb;\n // soft edge anti-alias\n data[idx + 3] = r > radius - 1 ? Math.round(255 * (radius - r)) : 255;\n }\n }\n ctx.putImageData(img, 0, 0);\n }, [l]);\n\n const notify = useCallback(\n (nh: number, ns: number, nl: number, na: number) => {\n onChange?.(buildColorValue(nh, ns, nl, na));\n },\n [onChange]\n );\n\n // Disc drag\n const updateDisc = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dx = clientX - cx;\n const dy = clientY - cy;\n const r = Math.sqrt(dx * dx + dy * dy);\n const radius = rect.width / 2;\n const clampedR = Math.min(r, radius);\n const theta = (Math.atan2(dy, dx) * 180) / Math.PI;\n const nh = (theta + 360) % 360;\n const ns = (clampedR / radius) * 100;\n setH(nh); setS(ns);\n notify(nh, ns, l, a);\n },\n [l, a, notify]\n );\n\n const handleDiscPointerDown = useCallback(\n (e: React.PointerEvent<HTMLCanvasElement>) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n updateDisc(e.clientX, e.clientY, e.currentTarget.getBoundingClientRect());\n },\n [updateDisc]\n );\n\n const handleDiscPointerMove = useCallback(\n (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (e.buttons === 0) return;\n updateDisc(e.clientX, e.clientY, e.currentTarget.getBoundingClientRect());\n },\n [updateDisc]\n );\n\n const handleLChange = useCallback(\n (nl: number) => { setL(nl); notify(h, s, nl, a); },\n [h, s, a, notify]\n );\n\n const handleAChange = useCallback(\n (val: number) => { const na = val / 100; setA(na); notify(h, s, l, na); },\n [h, s, l, notify]\n );\n\n // Computed\n const { r: rr, g: gg, b: bb } = hslToRgb(h, s, l);\n const luminance = (0.299 * rr + 0.587 * gg + 0.114 * bb) / 255;\n const swatchFg = luminance > 0.6 ? \"rgba(0,0,0,0.5)\" : \"rgba(255,255,255,0.9)\";\n const hexStr = hslToHex(h, s, l);\n const rgbStr = `rgb(${rr}, ${gg}, ${bb})`;\n const colorValue = buildColorValue(h, s, l, a);\n\n // Dot position on canvas (canvas coords → CSS px)\n const dotX = DISC / 2 + (s / 100) * (DISC / 2) * Math.cos((h * Math.PI) / 180);\n const dotY = DISC / 2 + (s / 100) * (DISC / 2) * Math.sin((h * Math.PI) / 180);\n\n // L slider gradient\n const lGradient = `linear-gradient(to right,\n hsl(${h}, ${s}%, 5%),\n hsl(${h}, ${s}%, 50%),\n hsl(${h}, ${s}%, 95%))`;\n\n // Alpha gradient\n const alphaGradient = `linear-gradient(to right, transparent, ${rgbStr})`;\n\n // EyeDropper\n const handleEyeDropper = async () => {\n if (!window.EyeDropper) return;\n try {\n const result = await new window.EyeDropper().open();\n const [nh, ns, nl] = hexToHsl(result.sRGBHex);\n setH(nh); setS(ns); setL(nl);\n notify(nh, ns, nl, a);\n } catch {\n // user cancelled\n }\n };\n\n // Copy\n const handleCopy = () => {\n const text =\n mode === \"hex\" ? colorValue.hexa :\n mode === \"hsl\" ? colorValue.hsla :\n colorValue.rgba;\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n });\n };\n\n // Swatch click\n const handleSwatch = (color: string) => {\n const [nh, ns, nl] = hexToHsl(color);\n setH(nh); setS(ns); setL(nl);\n notify(nh, ns, nl, a);\n };\n\n // Accent vars\n const accentVars = accent ? accentToCssVars(deriveAccent(accent), \"colorpicker\") : {};\n\n const displayValue =\n mode === \"hex\" ? colorValue.hexa :\n mode === \"hsl\" ? colorValue.hsla :\n colorValue.rgba;\n\n return (\n <div\n className={[styles.colorPicker, className ?? \"\"].filter(Boolean).join(\" \")}\n data-theme={theme}\n style={accentVars as React.CSSProperties}\n >\n {/* Disc */}\n <div className={styles.topRow}>\n <div className={styles.discWrapper}>\n <canvas\n ref={canvasRef}\n width={DISC}\n height={DISC}\n className={styles.disc}\n onPointerDown={handleDiscPointerDown}\n onPointerMove={handleDiscPointerMove}\n />\n <div\n className={styles.dot}\n style={{\n left: dotX,\n top: dotY,\n borderColor: l > 55 ? \"rgba(0,0,0,0.5)\" : \"rgba(255,255,255,0.85)\",\n }}\n />\n </div>\n </div>\n\n {/* Lightness slider */}\n <SliderControl\n value={l}\n onChange={handleLChange}\n min={0}\n max={100}\n step={1}\n showTooltip=\"never\"\n railBackground={lGradient}\n />\n\n {/* Alpha slider */}\n {showAlpha && (\n <SliderControl\n value={Math.round(a * 100)}\n onChange={handleAChange}\n min={0}\n max={100}\n step={1}\n showTooltip=\"never\"\n railBackground={`linear-gradient(to right, transparent, ${rgbStr}), repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0 / 10px 10px`}\n />\n )}\n\n {/* Preview swatch */}\n <div\n className={styles.previewSwatch}\n style={{ background: showAlpha ? colorValue.rgba : hexStr }}\n >\n {hasEyeDropper && (\n <button\n className={styles.eyedropperBtn}\n onClick={handleEyeDropper}\n title=\"Pick color\"\n style={{ color: swatchFg, background: `rgba(${luminance > 0.6 ? \"0,0,0\" : \"255,255,255\"},0.15)` }}\n >\n <EyedropperIcon />\n </button>\n )}\n </div>\n\n {/* Mode tabs + inputs */}\n <div className={styles.inputSection}>\n <div className={styles.tabs}>\n {([\"hex\", \"hsl\", \"rgb\"] as const).map((m) => (\n <button\n key={m}\n className={[styles.tab, mode === m ? styles.tabActive : \"\"].filter(Boolean).join(\" \")}\n onClick={() => setMode(m)}\n >\n {m.toUpperCase()}\n </button>\n ))}\n </div>\n\n <ColorInput\n mode={mode}\n h={h} s={s} l={l}\n r={rr} g={gg} b={bb}\n hex={hexStr}\n onChange={(nh, ns, nl) => {\n setH(nh); setS(ns); setL(nl);\n notify(nh, ns, nl, a);\n }}\n onCopy={handleCopy}\n copied={copied}\n />\n </div>\n\n {/* Recent colors */}\n {recentColors.length > 0 && (\n <div className={styles.recents}>\n <span className={styles.recentsLabel}>Recent</span>\n <div className={styles.swatches}>\n {recentColors.slice(0, 8).map((c, i) => (\n <button\n key={i}\n className={styles.recentSwatch}\n style={{ background: c }}\n onClick={() => handleSwatch(c)}\n title={c}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n","@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.counter {\n display: inline-flex;\n align-items: center;\n gap: 1px;\n font-family: var(--font-family-base);\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--sliding-counter-accent-dot, var(--accent-dot));\n user-select: none;\n}\n\n.sign {\n line-height: 1;\n margin-right: 2px;\n}\n\n.separator {\n line-height: 1;\n margin: 0 1px;\n opacity: 0.5;\n align-self: flex-end;\n padding-bottom: 0.5em;\n}\n\n.reelWindow {\n overflow: hidden;\n position: relative;\n}\n.reelWindow.sm {\n height: 1.6rem;\n width: 0.85rem;\n font-size: 1.25rem;\n line-height: 1.6rem;\n}\n.reelWindow.md {\n height: 2.6rem;\n width: 1.35rem;\n font-size: 2rem;\n line-height: 2.6rem;\n}\n.reelWindow.lg {\n height: 3.8rem;\n width: 2rem;\n font-size: 3rem;\n line-height: 3.8rem;\n}\n\n.reel {\n display: flex;\n flex-direction: column;\n transition: transform 420ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.digitCell {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.reelWindow.sm .digitCell {\n height: 1.6rem;\n width: 0.85rem;\n}\n.reelWindow.md .digitCell {\n height: 2.6rem;\n width: 1.35rem;\n}\n.reelWindow.lg .digitCell {\n height: 3.8rem;\n width: 2rem;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlNsaWRpbmdDb3VudGVyLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ3pGRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7O0FBR0U7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFKRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUpGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQU1OO0VBQ0U7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUdFO0VBQ0U7RUFDQTs7QUFGRjtFQUNFO0VBQ0E7O0FBRkY7RUFDRTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAdXNlIFwiLi4vLi4vc3R5bGVzL3Rva2Vuc1wiO1xuXG4vLyDilIDilIAgU2l6ZSBtYXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4kc2l6ZXM6IChcbiAgc206IChmb250OiAxLjI1cmVtLCBjZWxsOiAxLjZyZW0sIHdpZHRoOiAwLjg1cmVtKSxcbiAgbWQ6IChmb250OiAycmVtLCAgICBjZWxsOiAyLjZyZW0sIHdpZHRoOiAxLjM1cmVtKSxcbiAgbGc6IChmb250OiAzcmVtLCAgICBjZWxsOiAzLjhyZW0sIHdpZHRoOiAycmVtKSxcbik7XG5cbi8vIOKUgOKUgCBDb3VudGVyIHdyYXBwZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4uY291bnRlciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDFweDtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICBmb250LXdlaWdodDogNjAwO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICBjb2xvcjogdmFyKC0tc2xpZGluZy1jb3VudGVyLWFjY2VudC1kb3QsIHZhcigtLWFjY2VudC1kb3QpKTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi8vIOKUgOKUgCBTaWduIChtaW51cykgYW5kIGRlY2ltYWwgc2VwYXJhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLnNpZ24ge1xuICBsaW5lLWhlaWdodDogMTtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG59XG5cbi5zZXBhcmF0b3Ige1xuICBsaW5lLWhlaWdodDogMTtcbiAgbWFyZ2luOiAwIDFweDtcbiAgb3BhY2l0eTogMC41O1xuICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgcGFkZGluZy1ib3R0b206IDAuNWVtO1xufVxuXG4vLyDilIDilIAgUmVlbCB3aW5kb3cg4oCUIGNsaXBzIHRvIG9uZSBkaWdpdCBoZWlnaHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4ucmVlbFdpbmRvdyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICBAZWFjaCAkbmFtZSwgJG1hcCBpbiAkc2l6ZXMge1xuICAgICYuI3skbmFtZX0ge1xuICAgICAgaGVpZ2h0OiBtYXAtZ2V0KCRtYXAsIGNlbGwpO1xuICAgICAgd2lkdGg6IG1hcC1nZXQoJG1hcCwgd2lkdGgpO1xuICAgICAgZm9udC1zaXplOiBtYXAtZ2V0KCRtYXAsIGZvbnQpO1xuICAgICAgbGluZS1oZWlnaHQ6IG1hcC1nZXQoJG1hcCwgY2VsbCk7XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgCBUaGUgc2Nyb2xsaW5nIGNvbHVtbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi5yZWVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDQyMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG59XG5cbi8vIOKUgOKUgCBTaW5nbGUgZGlnaXQgY2VsbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi5kaWdpdENlbGwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleC1zaHJpbms6IDA7XG5cbiAgQGVhY2ggJG5hbWUsICRtYXAgaW4gJHNpemVzIHtcbiAgICAucmVlbFdpbmRvdy4jeyRuYW1lfSAmIHtcbiAgICAgIGhlaWdodDogbWFwLWdldCgkbWFwLCBjZWxsKTtcbiAgICAgIHdpZHRoOiBtYXAtZ2V0KCRtYXAsIHdpZHRoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== */","import React, { useEffect, useRef, useState } from \"react\";\nimport styles from \"./SlidingCounter.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport type SlidingCounterSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SlidingCounterProps {\n value: number;\n /** Minimum integer digits shown (zero-padded on the left) */\n minDigits?: number;\n /** Number of decimal digits to display. 0 = no decimals. */\n decimals?: number;\n /** Decimal separator character */\n decimalSeparator?: string;\n size?: SlidingCounterSize;\n /** Custom accent color — overrides the global theme for this instance */\n accent?: string;\n className?: string;\n}\n\ninterface DigitReelProps {\n digit: number;\n direction: \"up\" | \"down\";\n size: SlidingCounterSize;\n}\n\n// 3 copies of 0-9: [0-9 | 0-9 | 0-9] — middle copy is the \"home\" position.\n// After each transition we silently snap back to middle to keep the range usable indefinitely.\nconst COPIES = 3;\nconst TOTAL = COPIES * 10; // 30 cells\n\nconst DigitReel: React.FC<DigitReelProps> = ({ digit, direction, size }) => {\n const posRef = useRef(10 + digit);\n const prevDigitRef = useRef(digit);\n const [pos, setPos] = useState(10 + digit);\n const [animate, setAnimate] = useState(true);\n\n useEffect(() => {\n if (prevDigitRef.current === digit) return;\n\n const prev = prevDigitRef.current;\n let next = posRef.current;\n\n if (direction === \"up\") {\n next += digit > prev ? digit - prev : 10 - prev + digit;\n } else {\n next -= digit < prev ? prev - digit : prev + 10 - digit;\n }\n\n posRef.current = next;\n prevDigitRef.current = digit;\n setAnimate(true);\n setPos(next);\n }, [digit, direction]);\n\n const handleTransitionEnd = () => {\n const normalized = 10 + (((posRef.current % 10) + 10) % 10);\n posRef.current = normalized;\n setAnimate(false);\n setPos(normalized);\n };\n\n const translateY = -(pos / TOTAL) * 100;\n\n const cells = Array.from({ length: COPIES }, () =>\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n ).flat();\n\n return (\n <div className={`${styles.reelWindow} ${styles[size]}`}>\n <div\n className={styles.reel}\n style={{\n transform: `translateY(${translateY}%)`,\n transition: animate ? undefined : \"none\",\n }}\n onTransitionEnd={handleTransitionEnd}\n >\n {cells.map((d, i) => (\n <div key={i} className={styles.digitCell}>\n {d}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\n/** Split a number into integer and decimal digit arrays with explicit decimal places. */\nfunction splitDigits(\n value: number,\n minDigits: number,\n decimals: number\n): { intDigits: number[]; decDigits: number[] } {\n const abs = Math.abs(value);\n const fixed = abs.toFixed(decimals);\n const [intPart, decPart = \"\"] = fixed.split(\".\");\n\n const intDigits = intPart.split(\"\").map(Number);\n const padded =\n intDigits.length < minDigits\n ? [...Array(minDigits - intDigits.length).fill(0), ...intDigits]\n : intDigits;\n\n const decDigits = decPart.split(\"\").map(Number);\n\n return { intDigits: padded, decDigits };\n}\n\nexport const SlidingCounter: React.FC<SlidingCounterProps> = ({\n value,\n minDigits = 1,\n decimals = 0,\n decimalSeparator = \".\",\n size = \"md\",\n accent,\n className,\n}) => {\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"sliding-counter\")\n : {};\n\n const safeValue = isFinite(value) ? value : 0;\n\n const prevValueRef = useRef(safeValue);\n const direction = safeValue >= prevValueRef.current ? \"up\" : \"down\";\n prevValueRef.current = safeValue;\n\n const { intDigits, decDigits } = splitDigits(safeValue, minDigits, decimals);\n\n return (\n <div\n className={[styles.counter, styles[size], className ?? \"\"]\n .filter(Boolean)\n .join(\" \")}\n style={accentVars as React.CSSProperties}\n aria-label={safeValue.toFixed(decimals)}\n >\n {safeValue < 0 && <span className={styles.sign}>−</span>}\n\n {intDigits.map((digit, i) => (\n <DigitReel key={`int-${intDigits.length - i}`} digit={digit} direction={direction} size={size} />\n ))}\n\n {decimals > 0 && (\n <span className={styles.separator}>{decimalSeparator}</span>\n )}\n\n {decDigits.map((digit, i) => (\n <DigitReel key={`dec-${i}`} digit={digit} direction={direction} size={size} />\n ))}\n </div>\n );\n};\n","@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.root {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n background: var(--color-surface);\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n.root:focus-within {\n border-color: var(--rich-text-editor-accent-ring, var(--accent-ring));\n box-shadow: 0 0 0 3px var(--rich-text-editor-accent-glow, var(--accent-glow));\n}\n\n.readOnly {\n border-color: transparent;\n background: transparent;\n}\n.readOnly:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n\n.toolbar {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n padding: var(--spacing-1) var(--spacing-2);\n background: var(--color-surface-elevated);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n flex-shrink: 0;\n position: sticky;\n top: var(--spacing-1);\n margin: var(--spacing-1) var(--spacing-1) 0;\n z-index: 10;\n}\n\n.toolbarGroup {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.divider {\n width: 1px;\n height: 18px;\n background: var(--color-neutral-200);\n margin: 0 var(--spacing-1);\n flex-shrink: 0;\n}\n\n.toolbarButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-600);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-family: var(--font-family-base);\n line-height: 1;\n transition: background var(--transition-fast), color var(--transition-fast);\n}\n.toolbarButton:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n.toolbarButton:focus-visible {\n outline: 2px solid var(--rich-text-editor-accent-ring, var(--accent-ring));\n outline-offset: 1px;\n}\n.toolbarButton.active {\n background: var(--rich-text-editor-accent-light, var(--accent-light));\n color: var(--rich-text-editor-accent, var(--accent));\n}\n\n.headingButton {\n width: auto;\n min-width: 28px;\n padding: 0 var(--spacing-2);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n}\n\n.bubbleMenu {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: var(--spacing-1) var(--spacing-2);\n background: var(--color-surface-elevated);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-md);\n}\n\n.prose {\n color: var(--color-neutral-900);\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n line-height: 1.65;\n}\n.prose > * + * {\n margin-top: 0.5em;\n}\n.prose p {\n margin: 0;\n}\n.prose h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.25;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.prose h1:first-child {\n margin-top: 0;\n}\n.prose h2 {\n font-size: 1.375rem;\n font-weight: 600;\n line-height: 1.3;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.prose h2:first-child {\n margin-top: 0;\n}\n.prose h3 {\n font-size: 1.125rem;\n font-weight: 600;\n line-height: 1.4;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.prose h3:first-child {\n margin-top: 0;\n}\n.prose ul, .prose ol {\n padding-left: 1.5em;\n margin: 0.5em 0;\n}\n.prose ul {\n list-style-type: disc;\n}\n.prose ol {\n list-style-type: decimal;\n}\n.prose li {\n line-height: 1.65;\n}\n.prose li + li {\n margin-top: 0.25em;\n}\n.prose li p {\n margin: 0;\n}\n.prose {\n padding: var(--spacing-3) var(--spacing-4);\n}\n\n.editorContent {\n flex: 1;\n overflow-y: auto;\n max-height: var(--rte-max-height);\n scrollbar-width: thin;\n scrollbar-color: var(--color-neutral-200) transparent;\n}\n.editorContent::-webkit-scrollbar {\n width: 4px;\n}\n.editorContent::-webkit-scrollbar-track {\n background: transparent;\n}\n.editorContent::-webkit-scrollbar-thumb {\n background: var(--color-neutral-200);\n border-radius: var(--radius-full);\n}\n.editorContent::before {\n content: \"\";\n display: block;\n position: sticky;\n top: 0;\n pointer-events: none;\n z-index: 9;\n}\n.editorContent :global(.ProseMirror) {\n color: var(--color-neutral-900);\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n line-height: 1.65;\n}\n.editorContent :global(.ProseMirror) > * + * {\n margin-top: 0.5em;\n}\n.editorContent :global(.ProseMirror) p {\n margin: 0;\n}\n.editorContent :global(.ProseMirror) h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.25;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.editorContent :global(.ProseMirror) h1:first-child {\n margin-top: 0;\n}\n.editorContent :global(.ProseMirror) h2 {\n font-size: 1.375rem;\n font-weight: 600;\n line-height: 1.3;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.editorContent :global(.ProseMirror) h2:first-child {\n margin-top: 0;\n}\n.editorContent :global(.ProseMirror) h3 {\n font-size: 1.125rem;\n font-weight: 600;\n line-height: 1.4;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.editorContent :global(.ProseMirror) h3:first-child {\n margin-top: 0;\n}\n.editorContent :global(.ProseMirror) ul, .editorContent :global(.ProseMirror) ol {\n padding-left: 1.5em;\n margin: 0.5em 0;\n}\n.editorContent :global(.ProseMirror) ul {\n list-style-type: disc;\n}\n.editorContent :global(.ProseMirror) ol {\n list-style-type: decimal;\n}\n.editorContent :global(.ProseMirror) li {\n line-height: 1.65;\n}\n.editorContent :global(.ProseMirror) li + li {\n margin-top: 0.25em;\n}\n.editorContent :global(.ProseMirror) li p {\n margin: 0;\n}\n.editorContent :global(.ProseMirror) {\n min-height: var(--rte-min-height, 200px);\n padding: var(--spacing-3) var(--spacing-4);\n outline: none;\n caret-color: var(--rich-text-editor-accent, var(--accent));\n}\n.editorContent :global(.ProseMirror) p.is-empty:first-child::before {\n content: attr(data-placeholder);\n color: var(--color-neutral-400);\n pointer-events: none;\n float: left;\n height: 0;\n}\n.editorContent :global(.ProseMirror) div[data-type=page-break] {\n position: relative;\n margin: 1em 0;\n border: none;\n height: 0;\n border-top: 2px dashed var(--color-neutral-200);\n pointer-events: none;\n user-select: none;\n}\n.editorContent :global(.ProseMirror) div[data-type=page-break]::after {\n content: \"Page break\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 0 var(--spacing-2);\n background: var(--color-surface);\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n font-family: var(--font-family-base);\n white-space: nowrap;\n}\n.editorContent :global(.ProseMirror) ::selection {\n background: var(--rich-text-editor-accent-light, var(--accent-light));\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlJpY2hUZXh0RWRpdG9yLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQy9GRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxZQUNFOztBQUVGO0VBQ0U7RUFDQTs7O0FBSUo7RUFDRTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLFlBQ0U7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQThERjtFQXZERTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUFVOztBQUVWO0VBQUk7O0FBRUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBQ0E7RUFBZ0I7O0FBR2xCO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUNBO0VBQWdCOztBQUdsQjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFDQTtFQUFnQjs7QUFHbEI7RUFDRTtFQUNBOztBQUdGO0VBQUs7O0FBQ0w7RUFBSzs7QUFFTDtFQUNFOztBQUNBO0VBQU87O0FBQ1A7RUFBSTs7QUFLUjtFQUVFOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFBdUI7O0FBQ3ZCO0VBQTZCOztBQUM3QjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUlBO0VBQ0E7O0FBR0Y7RUF4RkE7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFBVTs7QUFFVjtFQUFJOztBQUVKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUNBO0VBQWdCOztBQUdsQjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFDQTtFQUFnQjs7QUFHbEI7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBQ0E7RUFBZ0I7O0FBR2xCO0VBQ0U7RUFDQTs7QUFHRjtFQUFLOztBQUNMO0VBQUs7O0FBRUw7RUFDRTs7QUFDQTtFQUFPOztBQUNQO0VBQUk7O0FBc0NOO0VBRUU7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlKO0VBQ0UiLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlIFwic2Fzczpjb2xvclwiO1xuXG5AaW1wb3J0IHVybChcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXBcIik7XG5cbi8vIEFjY2VudCBkaSBkZWZhdWx0IOKAlCBjYW1iaWEgcXVpIHBlciBhZ2dpb3JuYXJlIHR1dHRhIGxhIGxpYnJlcmlhXG4kYWNjZW50OiAjM2I4MmY2O1xuXG46cm9vdCB7XG4gIC8vIEFjY2VudCBzY2FsZSDigJQgZGVyaXZhdGEgZGEgJGFjY2VudCBhIGNvbXBpbGUgdGltZVxuICAtLWFjY2VudDogICAgICAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWRvdDogICAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAxMiUpfTtcbiAgLS1hY2NlbnQtdHJhY2s6ICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1yaW5nOiAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWdsb3c6ICAgI3tjb2xvci5jaGFuZ2UoJGFjY2VudCwgJGFscGhhOiAwLjMpfTtcbiAgLS1hY2NlbnQtbGlnaHQ6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ1JSwgJHNhdHVyYXRpb246IC0yMCUpfTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIChtYW50ZW51dGEgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AgY29uIEJ1dHRvbiwgQmFkZ2UsIElucHV0KVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ5JSwgJHNhdHVyYXRpb246IC0zMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTEwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0MiUsICRzYXR1cmF0aW9uOiAtMTUlKX07XG4gIC0tY29sb3ItcHJpbWFyeS00MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tY29sb3ItcHJpbWFyeS01MDA6ICN7JGFjY2VudH07XG4gIC0tY29sb3ItcHJpbWFyeS02MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogLTEwJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNzAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0yMCUpfTtcblxuICAvLyBOZXV0cmFsXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICNmZmZmZmY7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICNmM2Y0ZjY7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICNlNWU3ZWI7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5Y2EzYWY7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICM0YjU1NjM7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICMxMTE4Mjc7XG5cbiAgLy8gU2VtYW50aWNcbiAgLS1jb2xvci1zdWNjZXNzLTUwMDogIzIyYzU1ZTtcbiAgLS1jb2xvci1zdWNjZXNzLTYwMDogIzE2YTM0YTtcbiAgLS1jb2xvci1kYW5nZXItNTAwOiAgI2VmNDQ0NDtcbiAgLS1jb2xvci1kYW5nZXItNjAwOiAgI2RjMjYyNjtcbiAgLS1jb2xvci13YXJuaW5nLTUwMDogI2Y1OWUwYjtcbiAgLS1jb2xvci13YXJuaW5nLTYwMDogI2Q5NzcwNjtcblxuICAvLyBUeXBvZ3JhcGh5XG4gIC0tZm9udC1mYW1pbHktYmFzZTogXCJJbnRlclwiLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWY7XG4gIC0tZm9udC1zaXplLXhzOiAwLjc1cmVtO1xuICAtLWZvbnQtc2l6ZS1zbTogMC44NzVyZW07XG4gIC0tZm9udC1zaXplLW1kOiAxcmVtO1xuICAtLWZvbnQtc2l6ZS1sZzogMS4xMjVyZW07XG5cbiAgLy8gU3BhY2luZ1xuICAtLXNwYWNpbmctMTogMC4yNXJlbTtcbiAgLS1zcGFjaW5nLTI6IDAuNXJlbTtcbiAgLS1zcGFjaW5nLTM6IDAuNzVyZW07XG4gIC0tc3BhY2luZy00OiAxcmVtO1xuXG4gIC8vIFJhZGl1c1xuICAtLXJhZGl1cy1zbTogICAwLjI1cmVtO1xuICAtLXJhZGl1cy1tZDogICAwLjM3NXJlbTtcbiAgLS1yYWRpdXMtbGc6ICAgMC41cmVtO1xuICAtLXJhZGl1cy1mdWxsOiA5OTk5cHg7XG5cbiAgLy8gU2hhZG93c1xuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7XG4gIC0tc2hhZG93LW1kOiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuXG4gIC8vIFRyYW5zaXRpb25zXG4gIC0tdHJhbnNpdGlvbi1mYXN0OiAxNTBtcyBlYXNlO1xuXG4gIC8vIFN1cmZhY2UgKGJhY2tncm91bmQgZGkgY2FyZC9wYW5lbClcbiAgLS1jb2xvci1zdXJmYWNlOiAgICAgICAgICAjZmZmZmZmO1xuICAtLWNvbG9yLXN1cmZhY2UtZWxldmF0ZWQ6ICNmZmZmZmY7XG59XG5cbi8vIOKUgOKUgOKUgCBEYXJrIHRoZW1lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXBwbGljYXRvIHZpYSBkYXRhLXRoZW1lPVwiZGFya1wiIHN1bGwnZWxlbWVudG8gcm9vdCAoZ2VzdGl0byBkYSBTdG9yeWJvb2sgZGVjb3JhdG9yXG4vLyBlIGRhbGwnYXBwIGNvbnN1bWVyKS4gSSBjb21wb25lbnRpIG5vbiBkZXZvbm8gZmFyZSBudWxsYSBkaSBzcGVjaWFsZTogYmFzdGEgY2hlXG4vLyB1c2lubyBpIHRva2VuIHZhcigpIGUgcmljZXZlcmFubm8gYXV0b21hdGljYW1lbnRlIGkgdmFsb3JpIGRhcmsuXG5cbltkYXRhLXRoZW1lPVwiZGFya1wiXSB7XG4gIC8vIE5ldXRyYWwgKHNjYWxhIGludmVydGl0YSlcbiAgLS1jb2xvci1uZXV0cmFsLTA6ICAgIzBmMTcyYTtcbiAgLS1jb2xvci1uZXV0cmFsLTEwMDogIzFlMjkzYjtcbiAgLS1jb2xvci1uZXV0cmFsLTIwMDogIzMzNDE1NTtcbiAgLS1jb2xvci1uZXV0cmFsLTQwMDogIzk0YTNiODtcbiAgLS1jb2xvci1uZXV0cmFsLTYwMDogI2NiZDVlMTtcbiAgLS1jb2xvci1uZXV0cmFsLTkwMDogI2Y4ZmFmYztcblxuICAvLyBTdXJmYWNlXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgIzFlMjkzYjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjMjczNTQ5O1xuXG4gIC8vIFByaW1hcnkgc2NhbGUgZGFyayAocGVyIGlsIGRlZmF1bHQgYWNjZW50IGJsdSDigJQgbGUgc2Z1bWF0dXJlIGNoaWFyZSBkaXZlbnRhbm8gc2N1cmUpXG4gIC0tY29sb3ItcHJpbWFyeS01MDogICMxNzI1NTQ7XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICMxZTNhOGE7XG4gIC8vIDQwMCAvIDUwMCAvIDYwMCAvIDcwMCByaW1hbmdvbm8gaW52YXJpYXRpIChhYmJhc3RhbnphIHNhdHVyaSBzdSBiZyBzY3VybylcblxuICAvLyBBY2NlbnQgbGlnaHQ6IHZhcmlhbnRlIHNjdXJhXG4gIC0tYWNjZW50LWxpZ2h0OiAjMTcyNTU0O1xuXG4gIC8vIFNoYWRvd3MgKHBpw7kgZm9ydGkgc3UgYmcgc2N1cm8pXG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjQpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC41KSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC40KTtcbn1cbiIsIkB1c2UgXCIuLi8uLi9zdHlsZXMvdG9rZW5zXCIgYXMgKjtcblxuLy8g4pSA4pSA4pSAIFJvb3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5yb290IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sb3ItbmV1dHJhbC0yMDApO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1zdXJmYWNlKTtcbiAgdHJhbnNpdGlvbjpcbiAgICBib3JkZXItY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSxcbiAgICBib3gtc2hhZG93IHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG4gICY6Zm9jdXMtd2l0aGluIHtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LXJpbmcsIHZhcigtLWFjY2VudC1yaW5nKSk7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LWdsb3csIHZhcigtLWFjY2VudC1nbG93KSk7XG4gIH1cbn1cblxuLnJlYWRPbmx5IHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cbiAgJjpmb2N1cy13aXRoaW4ge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVG9vbGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLnRvb2xiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IHZhcigtLXNwYWNpbmctMSk7XG4gIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMSkgdmFyKC0tc3BhY2luZy0yKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTtcbiAgZmxleC1zaHJpbms6IDA7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHRvcDogdmFyKC0tc3BhY2luZy0xKTtcbiAgbWFyZ2luOiB2YXIoLS1zcGFjaW5nLTEpIHZhcigtLXNwYWNpbmctMSkgMDtcbiAgei1pbmRleDogMTA7XG59XG5cbi50b29sYmFyR3JvdXAge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDJweDtcbn1cblxuLmRpdmlkZXIge1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgbWFyZ2luOiAwIHZhcigtLXNwYWNpbmctMSk7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4vLyDilIDilIDilIAgVG9vbGJhciBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi50b29sYmFyQnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMjhweDtcbiAgaGVpZ2h0OiAyOHB4O1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC02MDApO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXNtKTtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICBsaW5lLWhlaWdodDogMTtcbiAgdHJhbnNpdGlvbjpcbiAgICBiYWNrZ3JvdW5kIHZhcigtLXRyYW5zaXRpb24tZmFzdCksXG4gICAgY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KTtcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1uZXV0cmFsLTEwMCk7XG4gICAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgfVxuXG4gICY6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LXJpbmcsIHZhcigtLWFjY2VudC1yaW5nKSk7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgfVxuXG4gICYuYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yaWNoLXRleHQtZWRpdG9yLWFjY2VudC1saWdodCwgdmFyKC0tYWNjZW50LWxpZ2h0KSk7XG4gICAgY29sb3I6IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LCB2YXIoLS1hY2NlbnQpKTtcbiAgfVxufVxuXG4uaGVhZGluZ0J1dHRvbiB7XG4gIHdpZHRoOiBhdXRvO1xuICBtaW4td2lkdGg6IDI4cHg7XG4gIHBhZGRpbmc6IDAgdmFyKC0tc3BhY2luZy0yKTtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xufVxuXG4vLyDilIDilIDilIAgQnViYmxlIG1lbnUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5idWJibGVNZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMSkgdmFyKC0tc3BhY2luZy0yKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LW1kKTtcbn1cblxuLy8g4pSA4pSA4pSAIFNoYXJlZCBwcm9zZSB0eXBvZ3JhcGh5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXBwbGllZCBib3RoIHRvIHRoZSBlZGl0b3IgKC5lZGl0b3JDb250ZW50KSBhbmQgdG8gZXh0ZXJuYWwgcHJldmlldyBkaXZzICgucHJvc2UpLlxuXG5AbWl4aW4gcHJvc2Uge1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLW1kKTtcbiAgbGluZS1oZWlnaHQ6IDEuNjU7XG5cbiAgPiAqICsgKiB7IG1hcmdpbi10b3A6IDAuNWVtOyB9XG5cbiAgcCB7IG1hcmdpbjogMDsgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNzVyZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yNTtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICAgIG1hcmdpbi10b3A6IDAuNzVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07XG4gICAgJjpmaXJzdC1jaGlsZCB7IG1hcmdpbi10b3A6IDA7IH1cbiAgfVxuXG4gIGgyIHtcbiAgICBmb250LXNpemU6IDEuMzc1cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICAgIG1hcmdpbi10b3A6IDAuNzVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07XG4gICAgJjpmaXJzdC1jaGlsZCB7IG1hcmdpbi10b3A6IDA7IH1cbiAgfVxuXG4gIGgzIHtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICAgIG1hcmdpbi10b3A6IDAuNzVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07XG4gICAgJjpmaXJzdC1jaGlsZCB7IG1hcmdpbi10b3A6IDA7IH1cbiAgfVxuXG4gIHVsLCBvbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxLjVlbTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cblxuICB1bCB7IGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsgfVxuICBvbCB7IGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsgfVxuXG4gIGxpIHtcbiAgICBsaW5lLWhlaWdodDogMS42NTtcbiAgICArIGxpIHsgbWFyZ2luLXRvcDogMC4yNWVtOyB9XG4gICAgcCB7IG1hcmdpbjogMDsgfVxuICB9XG59XG5cbi8vIEV4cG9ydGVkIGNsYXNzIGZvciB1c2UgaW4gcHJldmlldyBkaXZzIG91dHNpZGUgdGhlIGVkaXRvci5cbi5wcm9zZSB7XG4gIEBpbmNsdWRlIHByb3NlO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTMpIHZhcigtLXNwYWNpbmctNCk7XG59XG5cbi8vIOKUgOKUgOKUgCBFZGl0b3IgY29udGVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLmVkaXRvckNvbnRlbnQge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1ydGUtbWF4LWhlaWdodCk7XG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjtcbiAgc2Nyb2xsYmFyLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCkgdHJhbnNwYXJlbnQ7XG5cbiAgJjo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNHB4OyB9XG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbiAgJjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtZnVsbCk7XG4gIH1cblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IHN0aWNreTtcbiAgICB0b3A6IDA7XG4gICAgLy8gaGVpZ2h0OiAzNnB4O1xuICAgIC8vIG1hcmdpbi1ib3R0b206IC0zNnB4O1xuICAgIC8vIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHZhcigtLWNvbG9yLXN1cmZhY2UpIDAlLCB0cmFuc3BhcmVudCAxMDAlKTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB6LWluZGV4OiA5O1xuICB9XG5cbiAgOmdsb2JhbCguUHJvc2VNaXJyb3IpIHtcbiAgICBAaW5jbHVkZSBwcm9zZTtcbiAgICBtaW4taGVpZ2h0OiB2YXIoLS1ydGUtbWluLWhlaWdodCwgMjAwcHgpO1xuICAgIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMykgdmFyKC0tc3BhY2luZy00KTtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGNhcmV0LWNvbG9yOiB2YXIoLS1yaWNoLXRleHQtZWRpdG9yLWFjY2VudCwgdmFyKC0tYWNjZW50KSk7XG5cbiAgICBwLmlzLWVtcHR5OmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgaGVpZ2h0OiAwO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBQYWdlIGJyZWFrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGRpdltkYXRhLXR5cGU9XCJwYWdlLWJyZWFrXCJdIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG1hcmdpbjogMWVtIDA7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBoZWlnaHQ6IDA7XG4gICAgICBib3JkZXItdG9wOiAycHggZGFzaGVkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCJQYWdlIGJyZWFrXCI7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIHBhZGRpbmc6IDAgdmFyKC0tc3BhY2luZy0yKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sb3Itc3VyZmFjZSk7XG4gICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXhzKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgfVxuICAgIH1cblxuICAgIDo6c2VsZWN0aW9uIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LWxpZ2h0LCB2YXIoLS1hY2NlbnQtbGlnaHQpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== */","import React, { useEffect, useState, useRef } from \"react\";\nimport { EditorProvider, useCurrentEditor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport type { JSONContent, Extensions } from \"@tiptap/core\";\nimport styles from \"./RichTextEditor.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport { useCurrentEditor } from \"@tiptap/react\";\n\nexport interface RichTextEditorProps {\n value?: string;\n placeholder?: string;\n readOnly?: boolean;\n minHeight?: string | number;\n maxHeight?: string | number;\n accent?: string;\n extensions?: Extensions;\n /** Rendered inside the toolbar, after the built-in buttons. Use with useCurrentEditor(). */\n slotBefore?: React.ReactNode;\n /** Rendered below the editor area. Use with useCurrentEditor(). */\n slotAfter?: React.ReactNode;\n onChangeHTML?: (html: string) => void;\n onChangeJSON?: (json: JSONContent) => void;\n}\n\ntype HeadingLevel = 1 | 2 | 3;\n\nconst BulletListIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"2.5\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" />\n <line x1=\"6\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"2.5\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\n <line x1=\"6\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"2.5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <line x1=\"6\" y1=\"12\" x2=\"14\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst OrderedListIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <text x=\"0.5\" y=\"5.5\" fontSize=\"5.5\" fill=\"currentColor\" fontFamily=\"system-ui, sans-serif\">1.</text>\n <line x1=\"7\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <text x=\"0.5\" y=\"9.5\" fontSize=\"5.5\" fill=\"currentColor\" fontFamily=\"system-ui, sans-serif\">2.</text>\n <line x1=\"7\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <text x=\"0.5\" y=\"13.5\" fontSize=\"5.5\" fill=\"currentColor\" fontFamily=\"system-ui, sans-serif\">3.</text>\n <line x1=\"7\" y1=\"12\" x2=\"14\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst Toolbar: React.FC<{ slotBefore?: React.ReactNode }> = ({ slotBefore }) => {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n return (\n <div className={styles.toolbar} role=\"toolbar\" aria-label=\"Text formatting\">\n <div className={styles.toolbarGroup}>\n {(\n [\n { render: () => <strong>B</strong>, title: \"Bold\", action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive(\"bold\") },\n { render: () => <em>I</em>, title: \"Italic\", action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive(\"italic\") },\n { render: () => <u>U</u>, title: \"Underline\", action: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive(\"underline\") },\n { render: () => <s>S</s>, title: \"Strikethrough\", action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive(\"strike\") },\n ] as const\n ).map(({ render, title, action, active }) => (\n <button\n key={title}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); action(); }}\n >\n {render()}\n </button>\n ))}\n </div>\n <div className={styles.divider} aria-hidden=\"true\" />\n <div className={styles.toolbarGroup}>\n {([1, 2, 3] as HeadingLevel[]).map((level) => (\n <button\n key={`h${level}`}\n type=\"button\"\n title={`Heading ${level}`}\n aria-label={`Heading ${level}`}\n aria-pressed={editor.isActive(\"heading\", { level })}\n className={[\n styles.toolbarButton,\n styles.headingButton,\n editor.isActive(\"heading\", { level }) ? styles.active : \"\",\n ].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); editor.chain().focus().toggleHeading({ level }).run(); }}\n >\n H{level}\n </button>\n ))}\n </div>\n <div className={styles.divider} aria-hidden=\"true\" />\n <div className={styles.toolbarGroup}>\n {(\n [\n { icon: <BulletListIcon />, title: \"Bullet list\", action: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive(\"bulletList\") },\n { icon: <OrderedListIcon />, title: \"Ordered list\", action: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive(\"orderedList\") },\n ] as const\n ).map(({ icon, title, action, active }) => (\n <button\n key={title}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); action(); }}\n >\n {icon}\n </button>\n ))}\n </div>\n {slotBefore && (\n <>\n <div className={styles.divider} aria-hidden=\"true\" />\n <div className={styles.toolbarGroup}>{slotBefore}</div>\n </>\n )}\n </div>\n );\n};\n\nconst BubbleMenu: React.FC = () => {\n const { editor } = useCurrentEditor();\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ x: number; y: number; flip: boolean } | null>(null);\n\n useEffect(() => {\n if (!editor) return;\n\n const update = () => {\n const { selection } = editor.state;\n if (selection.empty) { setPos(null); return; }\n const { from, to } = selection;\n const start = editor.view.coordsAtPos(from);\n const end = editor.view.coordsAtPos(to);\n const halfW = (menuRef.current?.offsetWidth ?? 0) / 2;\n const menuH = menuRef.current?.offsetHeight ?? 0;\n const rawX = (start.left + end.left) / 2;\n const clampedX = Math.max(halfW + 8, Math.min(rawX, window.innerWidth - halfW - 8));\n const toolbarBottom = document.querySelector(\"[role='toolbar']\")?.getBoundingClientRect().bottom ?? 0;\n const flip = start.top - menuH - 8 < toolbarBottom + 8;\n setPos({ x: clampedX, y: flip ? start.bottom : start.top, flip });\n };\n\n editor.on(\"selectionUpdate\", update);\n editor.on(\"blur\", () => setPos(null));\n return () => {\n editor.off(\"selectionUpdate\", update);\n editor.off(\"blur\", () => setPos(null));\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const visible = pos !== null;\n\n return (\n <div\n ref={menuRef}\n className={styles.bubbleMenu}\n aria-hidden={!visible}\n style={{\n position: \"fixed\",\n left: pos?.x ?? 0,\n top: pos?.y ?? 0,\n transform: pos?.flip\n ? \"translate(-50%, 8px)\"\n : \"translate(-50%, calc(-100% - 8px))\",\n zIndex: 50,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n }}\n >\n {(\n [\n { render: () => <strong>B</strong>, title: \"Bold\", action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive(\"bold\") },\n { render: () => <em>I</em>, title: \"Italic\", action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive(\"italic\") },\n { render: () => <u>U</u>, title: \"Underline\", action: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive(\"underline\") },\n { render: () => <s>S</s>, title: \"Strikethrough\", action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive(\"strike\") },\n ] as const\n ).map(({ render, title, action, active }) => (\n <button\n key={title}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); action(); }}\n >\n {render()}\n </button>\n ))}\n </div>\n );\n};\n\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\n value,\n placeholder = \"Start writing...\",\n readOnly = false,\n minHeight = 200,\n maxHeight,\n accent,\n extensions = [],\n slotBefore,\n slotAfter,\n onChangeHTML,\n onChangeJSON,\n}) => {\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"rich-text-editor\")\n : {};\n const minHeightValue = typeof minHeight === \"number\" ? `${minHeight}px` : minHeight;\n const maxHeightValue = maxHeight !== undefined\n ? (typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight)\n : undefined;\n\n return (\n <div\n className={[styles.root, readOnly ? styles.readOnly : \"\"].filter(Boolean).join(\" \")}\n style={{ ...accentVars, \"--rte-min-height\": minHeightValue, \"--rte-max-height\": maxHeightValue } as React.CSSProperties}\n >\n <EditorProvider\n extensions={[\n StarterKit.configure({ heading: { levels: [1, 2, 3] } }),\n Underline,\n Placeholder.configure({ placeholder }),\n ...extensions,\n ]}\n content={value}\n editable={!readOnly}\n onUpdate={({ editor }) => {\n onChangeHTML?.(editor.getHTML());\n onChangeJSON?.(editor.getJSON());\n }}\n slotBefore={!readOnly ? <Toolbar slotBefore={slotBefore} /> : undefined}\n slotAfter={slotAfter}\n editorContainerProps={{ className: styles.editorContent }}\n >\n {!readOnly && <BubbleMenu />}\n </EditorProvider>\n </div>\n );\n};\n","import type { EditorState, Transaction } from '@tiptap/pm/state'\n\n/**\n * Takes a Transaction & Editor State and turns it into a chainable state object\n * @param config The transaction and state to create the chainable state from\n * @returns A chainable Editor state object\n */\nexport function createChainableState(config: {\n transaction: Transaction\n state: EditorState\n}): EditorState {\n const { state, transaction } = config\n let { selection } = transaction\n let { doc } = transaction\n let { storedMarks } = transaction\n\n return {\n ...state,\n apply: state.apply.bind(state),\n applyTransaction: state.applyTransaction.bind(state),\n plugins: state.plugins,\n schema: state.schema,\n reconfigure: state.reconfigure.bind(state),\n toJSON: state.toJSON.bind(state),\n get storedMarks() {\n return storedMarks\n },\n get selection() {\n return selection\n },\n get doc() {\n return doc\n },\n get tr() {\n selection = transaction.selection\n doc = transaction.doc\n storedMarks = transaction.storedMarks\n\n return transaction\n },\n }\n}\n","import type { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport type { Editor } from './Editor.js'\nimport { createChainableState } from './helpers/createChainableState.js'\nimport type {\n AnyCommands,\n CanCommands,\n ChainedCommands,\n CommandProps,\n SingleCommands,\n} from './types.js'\n\nexport class CommandManager {\n editor: Editor\n\n rawCommands: AnyCommands\n\n customState?: EditorState\n\n constructor(props: { editor: Editor; state?: EditorState }) {\n this.editor = props.editor\n this.rawCommands = this.editor.extensionManager.commands\n this.customState = props.state\n }\n\n get hasCustomState(): boolean {\n return !!this.customState\n }\n\n get state(): EditorState {\n return this.customState || this.editor.state\n }\n\n get commands(): SingleCommands {\n const { rawCommands, editor, state } = this\n const { view } = editor\n const { tr } = state\n const props = this.buildProps(tr)\n\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n const method = (...args: any[]) => {\n const callback = command(...args)(props)\n\n if (!tr.getMeta('preventDispatch') && !this.hasCustomState) {\n view.dispatch(tr)\n }\n\n return callback\n }\n\n return [name, method]\n }),\n ) as unknown as SingleCommands\n }\n\n get chain(): () => ChainedCommands {\n return () => this.createChain()\n }\n\n get can(): () => CanCommands {\n return () => this.createCan()\n }\n\n public createChain(startTr?: Transaction, shouldDispatch = true): ChainedCommands {\n const { rawCommands, editor, state } = this\n const { view } = editor\n const callbacks: boolean[] = []\n const hasStartTransaction = !!startTr\n const tr = startTr || state.tr\n\n const run = () => {\n if (\n !hasStartTransaction &&\n shouldDispatch &&\n !tr.getMeta('preventDispatch') &&\n !this.hasCustomState\n ) {\n view.dispatch(tr)\n }\n\n return callbacks.every(callback => callback === true)\n }\n\n const chain = {\n ...Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n const chainedCommand = (...args: never[]) => {\n const props = this.buildProps(tr, shouldDispatch)\n const callback = command(...args)(props)\n\n callbacks.push(callback)\n\n return chain\n }\n\n return [name, chainedCommand]\n }),\n ),\n run,\n } as unknown as ChainedCommands\n\n return chain\n }\n\n public createCan(startTr?: Transaction): CanCommands {\n const { rawCommands, state } = this\n const dispatch = false\n const tr = startTr || state.tr\n const props = this.buildProps(tr, dispatch)\n const formattedCommands = Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args: never[]) => command(...args)({ ...props, dispatch: undefined })]\n }),\n ) as unknown as SingleCommands\n\n return {\n ...formattedCommands,\n chain: () => this.createChain(tr, dispatch),\n } as CanCommands\n }\n\n public buildProps(tr: Transaction, shouldDispatch = true): CommandProps {\n const { rawCommands, editor, state } = this\n const { view } = editor\n\n const props: CommandProps = {\n tr,\n editor,\n view,\n state: createChainableState({\n state,\n transaction: tr,\n }),\n dispatch: shouldDispatch ? () => undefined : undefined,\n chain: () => this.createChain(tr, shouldDispatch),\n can: () => this.createCan(tr),\n get commands() {\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args: never[]) => command(...args)(props)]\n }),\n ) as unknown as SingleCommands\n },\n }\n\n return props\n }\n}\n","export * from './blur.js'\nexport * from './clearContent.js'\nexport * from './clearNodes.js'\nexport * from './command.js'\nexport * from './createParagraphNear.js'\nexport * from './cut.js'\nexport * from './deleteCurrentNode.js'\nexport * from './deleteNode.js'\nexport * from './deleteRange.js'\nexport * from './deleteSelection.js'\nexport * from './enter.js'\nexport * from './exitCode.js'\nexport * from './extendMarkRange.js'\nexport * from './first.js'\nexport * from './focus.js'\nexport * from './forEach.js'\nexport * from './insertContent.js'\nexport * from './insertContentAt.js'\nexport * from './join.js'\nexport * from './joinItemBackward.js'\nexport * from './joinItemForward.js'\nexport * from './joinTextblockBackward.js'\nexport * from './joinTextblockForward.js'\nexport * from './keyboardShortcut.js'\nexport * from './lift.js'\nexport * from './liftEmptyBlock.js'\nexport * from './liftListItem.js'\nexport * from './newlineInCode.js'\nexport * from './resetAttributes.js'\nexport * from './scrollIntoView.js'\nexport * from './selectAll.js'\nexport * from './selectNodeBackward.js'\nexport * from './selectNodeForward.js'\nexport * from './selectParentNode.js'\nexport * from './selectTextblockEnd.js'\nexport * from './selectTextblockStart.js'\nexport * from './setContent.js'\nexport * from './setMark.js'\nexport * from './setMeta.js'\nexport * from './setNode.js'\nexport * from './setNodeSelection.js'\nexport * from './setTextDirection.js'\nexport * from './setTextSelection.js'\nexport * from './sinkListItem.js'\nexport * from './splitBlock.js'\nexport * from './splitListItem.js'\nexport * from './toggleList.js'\nexport * from './toggleMark.js'\nexport * from './toggleNode.js'\nexport * from './toggleWrap.js'\nexport * from './undoInputRule.js'\nexport * from './unsetAllMarks.js'\nexport * from './unsetMark.js'\nexport * from './unsetTextDirection.js'\nexport * from './updateAttributes.js'\nexport * from './wrapIn.js'\nexport * from './wrapInList.js'\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n blur: {\n /**\n * Removes focus from the editor.\n * @example editor.commands.blur()\n */\n blur: () => ReturnType\n }\n }\n}\n\nexport const blur: RawCommands['blur'] =\n () =>\n ({ editor, view }) => {\n requestAnimationFrame(() => {\n if (!editor.isDestroyed) {\n ;(view.dom as HTMLElement).blur()\n\n // Browsers should remove the caret on blur but safari does not.\n // See: https://github.com/ueberdosis/tiptap/issues/2405\n window?.getSelection()?.removeAllRanges()\n }\n })\n\n return true\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n clearContent: {\n /**\n * Clear the whole document.\n * @example editor.commands.clearContent()\n */\n clearContent: (\n /**\n * Whether to emit an update event.\n * @default true\n */\n emitUpdate?: boolean,\n ) => ReturnType\n }\n }\n}\n\nexport const clearContent: RawCommands['clearContent'] =\n (emitUpdate = true) =>\n ({ commands }) => {\n return commands.setContent('', { emitUpdate })\n }\n","import { liftTarget } from '@tiptap/pm/transform'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n clearNodes: {\n /**\n * Normalize nodes to a simple paragraph.\n * @example editor.commands.clearNodes()\n */\n clearNodes: () => ReturnType\n }\n }\n}\n\nexport const clearNodes: RawCommands['clearNodes'] =\n () =>\n ({ state, tr, dispatch }) => {\n const { selection } = tr\n const { ranges } = selection\n\n if (!dispatch) {\n return true\n }\n\n ranges.forEach(({ $from, $to }) => {\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.isText) {\n return\n }\n\n const { doc, mapping } = tr\n const $mappedFrom = doc.resolve(mapping.map(pos))\n const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize))\n const nodeRange = $mappedFrom.blockRange($mappedTo)\n\n if (!nodeRange) {\n return\n }\n\n const targetLiftDepth = liftTarget(nodeRange)\n\n if (node.type.isTextblock) {\n const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index())\n\n tr.setNodeMarkup(nodeRange.start, defaultType)\n }\n\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth)\n }\n })\n })\n\n return true\n }\n","import type { Command, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n command: {\n /**\n * Define a command inline.\n * @param fn The command function.\n * @example\n * editor.commands.command(({ tr, state }) => {\n * ...\n * return true\n * })\n */\n command: (fn: (props: Parameters<Command>[0]) => boolean) => ReturnType\n }\n }\n}\n\nexport const command: RawCommands['command'] = fn => props => {\n return fn(props)\n}\n","import { createParagraphNear as originalCreateParagraphNear } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n createParagraphNear: {\n /**\n * Create a paragraph nearby.\n * @example editor.commands.createParagraphNear()\n */\n createParagraphNear: () => ReturnType\n }\n }\n}\n\nexport const createParagraphNear: RawCommands['createParagraphNear'] =\n () =>\n ({ state, dispatch }) => {\n return originalCreateParagraphNear(state, dispatch)\n }\n","import { TextSelection } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n cut: {\n /**\n * Cuts content from a range and inserts it at a given position.\n * @param range The range to cut.\n * @param range.from The start position of the range.\n * @param range.to The end position of the range.\n * @param targetPos The position to insert the content at.\n * @example editor.commands.cut({ from: 1, to: 3 }, 5)\n */\n cut: ({ from, to }: { from: number; to: number }, targetPos: number) => ReturnType\n }\n }\n}\n\nexport const cut: RawCommands['cut'] =\n (originRange, targetPos) =>\n ({ editor, tr }) => {\n const { state } = editor\n\n const contentSlice = state.doc.slice(originRange.from, originRange.to)\n\n tr.deleteRange(originRange.from, originRange.to)\n const newPos = tr.mapping.map(targetPos)\n\n tr.insert(newPos, contentSlice.content)\n\n tr.setSelection(new TextSelection(tr.doc.resolve(Math.max(newPos - 1, 0))))\n\n return true\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteCurrentNode: {\n /**\n * Delete the node that currently has the selection anchor.\n * @example editor.commands.deleteCurrentNode()\n */\n deleteCurrentNode: () => ReturnType\n }\n }\n}\n\nexport const deleteCurrentNode: RawCommands['deleteCurrentNode'] =\n () =>\n ({ tr, dispatch }) => {\n const { selection } = tr\n const currentNode = selection.$anchor.node()\n\n // if there is content inside the current node, break out of this command\n if (currentNode.content.size > 0) {\n return false\n }\n\n const $pos = tr.selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (node.type === currentNode.type) {\n if (dispatch) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n\n tr.delete(from, to).scrollIntoView()\n }\n\n return true\n }\n }\n\n return false\n }\n","import type { NodeType, Schema } from '@tiptap/pm/model'\n\nexport function getNodeType(nameOrType: string | NodeType, schema: Schema): NodeType {\n if (typeof nameOrType === 'string') {\n if (!schema.nodes[nameOrType]) {\n throw Error(\n `There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`,\n )\n }\n\n return schema.nodes[nameOrType]\n }\n\n return nameOrType\n}\n","import type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteNode: {\n /**\n * Delete a node with a given type or name.\n * @param typeOrName The type or name of the node.\n * @example editor.commands.deleteNode('paragraph')\n */\n deleteNode: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const deleteNode: RawCommands['deleteNode'] =\n typeOrName =>\n ({ tr, state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n const $pos = tr.selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (node.type === type) {\n if (dispatch) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n\n tr.delete(from, to).scrollIntoView()\n }\n\n return true\n }\n }\n\n return false\n }\n","import type { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteRange: {\n /**\n * Delete a given range.\n * @param range The range to delete.\n * @example editor.commands.deleteRange({ from: 1, to: 3 })\n */\n deleteRange: (range: Range) => ReturnType\n }\n }\n}\n\nexport const deleteRange: RawCommands['deleteRange'] =\n range =>\n ({ tr, dispatch }) => {\n const { from, to } = range\n\n if (dispatch) {\n tr.delete(from, to)\n }\n\n return true\n }\n","import type { ResolvedPos, Schema } from '@tiptap/pm/model'\n\nimport type { RawCommands } from '../types.js'\n\n/**\n * Check if a node has text content based on its content specification.\n * Returns true if the node's content spec matches text* or text+ patterns.\n */\nconst hasTextContent = (nodeSpec: { content?: string }): boolean => {\n if (!nodeSpec.content) {\n return false\n }\n const textRegex = /^text(\\*|\\+)/\n return textRegex.test(nodeSpec.content)\n}\n\n/**\n * Expand selection position for a specific side (left or right) to handle inline text nodes.\n * This function checks if the position is within an inline node with text content and\n * expands it to include the entire node boundaries for proper deletion.\n * @param $pos - The resolved position to expand\n * @param schema - The ProseMirror schema\n * @param side - Which side to expand ('left' or 'right')\n * @returns The expanded position for deletion\n */\nconst expandSelectionForSide = (\n $pos: ResolvedPos,\n schema: Schema,\n side: 'left' | 'right',\n): number => {\n if (!$pos.parent.isInline) {\n return $pos.pos\n }\n\n if ((side === 'left' && $pos.pos > $pos.start()) || (side === 'right' && $pos.pos < $pos.end())) {\n return $pos.pos\n }\n\n const parentContent = schema.nodes[$pos.parent.type.name].spec\n if (!hasTextContent(parentContent)) {\n return $pos.pos\n }\n\n return side === 'left' ? $pos.start() - 1 : $pos.end() + 1\n}\n\n/**\n * Expand selection range to properly handle deletion of inline text nodes.\n * Inline text nodes don't collapse correctly when text inside is deleted,\n * so we need to expand the selection to include the entire node.\n * See: https://code.haverbeke.berlin/prosemirror/prosemirror/issues/1365\n */\nconst expandSelectionForInlineText = (\n $from: ResolvedPos,\n $to: ResolvedPos,\n schema: Schema,\n): { from: number; to: number } => {\n const from = expandSelectionForSide($from, schema, 'left')\n const to = expandSelectionForSide($to, schema, 'right')\n\n return { from, to }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteSelection: {\n /**\n * Delete the selection, if there is one.\n * @example editor.commands.deleteSelection()\n */\n deleteSelection: () => ReturnType\n }\n }\n}\n\nexport const deleteSelection: RawCommands['deleteSelection'] =\n () =>\n ({ state, dispatch }) => {\n const { $from, $to } = state.selection\n if (state.selection.empty) {\n return false\n }\n\n const { from, to } = expandSelectionForInlineText($from, $to, state.schema)\n\n if (dispatch) {\n state.tr.deleteRange(from, to).scrollIntoView()\n dispatch(state.tr)\n }\n\n return true\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n enter: {\n /**\n * Trigger enter.\n * @example editor.commands.enter()\n */\n enter: () => ReturnType\n }\n }\n}\n\nexport const enter: RawCommands['enter'] =\n () =>\n ({ commands }) => {\n return commands.keyboardShortcut('Enter')\n }\n","import { exitCode as originalExitCode } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n exitCode: {\n /**\n * Exit from a code block.\n * @example editor.commands.exitCode()\n */\n exitCode: () => ReturnType\n }\n }\n}\n\nexport const exitCode: RawCommands['exitCode'] =\n () =>\n ({ state, dispatch }) => {\n return originalExitCode(state, dispatch)\n }\n","export function isRegExp(value: any): value is RegExp {\n return Object.prototype.toString.call(value) === '[object RegExp]'\n}\n","import { isRegExp } from './isRegExp.js'\n\n/**\n * Check if object1 includes object2\n * @param object1 Object\n * @param object2 Object\n */\nexport function objectIncludes(\n object1: Record<string, any>,\n object2: Record<string, any>,\n options: { strict: boolean } = { strict: true },\n): boolean {\n const keys = Object.keys(object2)\n\n if (!keys.length) {\n return true\n }\n\n return keys.every(key => {\n if (options.strict) {\n return object2[key] === object1[key]\n }\n\n if (isRegExp(object2[key])) {\n return object2[key].test(object1[key])\n }\n\n return object2[key] === object1[key]\n })\n}\n","import type { Mark as ProseMirrorMark, MarkType, ResolvedPos } from '@tiptap/pm/model'\n\nimport type { Range } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\n\nfunction findMarkInSet(\n marks: ProseMirrorMark[],\n type: MarkType,\n attributes: Record<string, any> = {},\n): ProseMirrorMark | undefined {\n return marks.find(item => {\n return (\n item.type === type &&\n objectIncludes(\n // Only check equality for the attributes that are provided\n Object.fromEntries(Object.keys(attributes).map(k => [k, item.attrs[k]])),\n attributes,\n )\n )\n })\n}\n\nfunction isMarkInSet(\n marks: ProseMirrorMark[],\n type: MarkType,\n attributes: Record<string, any> = {},\n): boolean {\n return !!findMarkInSet(marks, type, attributes)\n}\n\n/**\n * Get the range of a mark at a resolved position.\n */\nexport function getMarkRange(\n /**\n * The position to get the mark range for.\n */\n $pos: ResolvedPos,\n /**\n * The mark type to get the range for.\n */\n type: MarkType,\n /**\n * The attributes to match against.\n * If not provided, only the first mark at the position will be matched.\n */\n attributes?: Record<string, any>,\n): Range | void {\n if (!$pos || !type) {\n return\n }\n let start = $pos.parent.childAfter($pos.parentOffset)\n\n // If the cursor is at the start of a text node that does not have the mark, look backward\n if (!start.node || !start.node.marks.some(mark => mark.type === type)) {\n start = $pos.parent.childBefore($pos.parentOffset)\n }\n\n // If there is no text node with the mark even backward, return undefined\n if (!start.node || !start.node.marks.some(mark => mark.type === type)) {\n return\n }\n\n // Default to only matching against the attributes of the first mark with the given type\n if (!attributes) {\n const firstMark = start.node.marks.find(mark => mark.type === type)\n if (firstMark) {\n attributes = firstMark.attrs\n }\n }\n\n // We now know that the cursor is either at the start, middle or end of a text node with the specified mark\n // so we can look it up on the targeted mark\n const mark = findMarkInSet([...start.node.marks], type, attributes)\n\n if (!mark) {\n return\n }\n\n let startIndex = start.index\n let startPos = $pos.start() + start.offset\n let endIndex = startIndex + 1\n let endPos = startPos + start.node.nodeSize\n\n while (\n startIndex > 0 &&\n isMarkInSet([...$pos.parent.child(startIndex - 1).marks], type, attributes)\n ) {\n startIndex -= 1\n startPos -= $pos.parent.child(startIndex).nodeSize\n }\n\n while (\n endIndex < $pos.parent.childCount &&\n isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)\n ) {\n endPos += $pos.parent.child(endIndex).nodeSize\n endIndex += 1\n }\n\n return {\n from: startPos,\n to: endPos,\n }\n}\n","import type { MarkType, Schema } from '@tiptap/pm/model'\n\nexport function getMarkType(nameOrType: string | MarkType, schema: Schema): MarkType {\n if (typeof nameOrType === 'string') {\n if (!schema.marks[nameOrType]) {\n throw Error(\n `There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`,\n )\n }\n\n return schema.marks[nameOrType]\n }\n\n return nameOrType\n}\n","import type { MarkType } from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\n\nimport { getMarkRange } from '../helpers/getMarkRange.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n extendMarkRange: {\n /**\n * Extends the text selection to the current mark by type or name.\n * @param typeOrName The type or name of the mark.\n * @param attributes The attributes to match against.\n * If not provided, only the first mark at the position will be matched.\n * @example editor.commands.extendMarkRange('bold')\n * @example editor.commands.extendMarkRange('mention', { userId: \"1\" })\n */\n extendMarkRange: (\n /**\n * The type or name of the mark.\n */\n typeOrName: string | MarkType,\n\n /**\n * The attributes of the mark.\n */\n attributes?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const extendMarkRange: RawCommands['extendMarkRange'] =\n (typeOrName, attributes) =>\n ({ tr, state, dispatch }) => {\n const type = getMarkType(typeOrName, state.schema)\n const { doc, selection } = tr\n const { $from, from, to } = selection\n\n if (dispatch) {\n const range = getMarkRange($from, type, attributes)\n\n if (range && range.from <= from && range.to >= to) {\n const newSelection = TextSelection.create(doc, range.from, range.to)\n\n tr.setSelection(newSelection)\n }\n }\n\n return true\n }\n","import type { Command, CommandProps, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n first: {\n /**\n * Runs one command after the other and stops at the first which returns true.\n * @param commands The commands to run.\n * @example editor.commands.first([command1, command2])\n */\n first: (commands: Command[] | ((props: CommandProps) => Command[])) => ReturnType\n }\n }\n}\n\nexport const first: RawCommands['first'] = commands => props => {\n const items = typeof commands === 'function' ? commands(props) : commands\n\n for (let i = 0; i < items.length; i += 1) {\n if (items[i](props)) {\n return true\n }\n }\n\n return false\n}\n","import { TextSelection } from '@tiptap/pm/state'\n\nexport function isTextSelection(value: unknown): value is TextSelection {\n return value instanceof TextSelection\n}\n","export function minMax(value = 0, min = 0, max = 0): number {\n return Math.min(Math.max(value, min), max)\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Selection, TextSelection } from '@tiptap/pm/state'\n\nimport type { FocusPosition } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\nexport function resolveFocusPosition(\n doc: ProseMirrorNode,\n position: FocusPosition = null,\n): Selection | null {\n if (!position) {\n return null\n }\n\n const selectionAtStart = Selection.atStart(doc)\n const selectionAtEnd = Selection.atEnd(doc)\n\n if (position === 'start' || position === true) {\n return selectionAtStart\n }\n\n if (position === 'end') {\n return selectionAtEnd\n }\n\n const minPos = selectionAtStart.from\n const maxPos = selectionAtEnd.to\n\n if (position === 'all') {\n return TextSelection.create(\n doc,\n minMax(0, minPos, maxPos),\n minMax(doc.content.size, minPos, maxPos),\n )\n }\n\n return TextSelection.create(\n doc,\n minMax(position, minPos, maxPos),\n minMax(position, minPos, maxPos),\n )\n}\n","export function isAndroid(): boolean {\n return navigator.platform === 'Android' || /android/i.test(navigator.userAgent)\n}\n","export function isiOS(): boolean {\n return (\n ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform,\n ) ||\n // iPad on iOS 13 detection\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document)\n )\n}\n","/**\n * Detects if the current browser is Safari (but not iOS Safari or Chrome).\n * @returns `true` if the browser is Safari, `false` otherwise.\n * @example\n * if (isSafari()) {\n * // Safari-specific handling\n * }\n */\nexport function isSafari(): boolean {\n return typeof navigator !== 'undefined'\n ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n : false\n}\n","import { isTextSelection } from '../helpers/isTextSelection.js'\nimport { resolveFocusPosition } from '../helpers/resolveFocusPosition.js'\nimport type { FocusPosition, RawCommands } from '../types.js'\nimport { isAndroid } from '../utilities/isAndroid.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isSafari } from '../utilities/isSafari.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n focus: {\n /**\n * Focus the editor at the given position.\n * @param position The position to focus at.\n * @param options.scrollIntoView Scroll the focused position into view after focusing\n * @example editor.commands.focus()\n * @example editor.commands.focus(32, { scrollIntoView: false })\n */\n focus: (\n /**\n * The position to focus at.\n */\n position?: FocusPosition,\n\n /**\n * Optional options\n * @default { scrollIntoView: true }\n */\n options?: {\n scrollIntoView?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const focus: RawCommands['focus'] =\n (position = null, options = {}) =>\n ({ editor, view, tr, dispatch }) => {\n options = {\n scrollIntoView: true,\n ...options,\n }\n\n const delayedFocus = () => {\n // focus within `requestAnimationFrame` breaks focus on iOS and Android\n // so we have to call this\n if (isiOS() || isAndroid()) {\n ;(view.dom as HTMLElement).focus()\n }\n\n // Safari requires preventScroll to avoid the browser scrolling to the\n // top of the editor when focus is called before the selection is set.\n // We exclude iOS and Android since they are already handled above.\n // see: https://github.com/ueberdosis/tiptap/issues/7318\n if (isSafari() && !isiOS() && !isAndroid()) {\n ;(view.dom as HTMLElement).focus({ preventScroll: true })\n }\n\n // For React we have to focus asynchronously. Otherwise wild things happen.\n // see: https://github.com/ueberdosis/tiptap/issues/1520\n requestAnimationFrame(() => {\n if (!editor.isDestroyed) {\n view.focus()\n\n if (options?.scrollIntoView) {\n editor.commands.scrollIntoView()\n }\n }\n })\n }\n\n try {\n if ((view.hasFocus() && position === null) || position === false) {\n return true\n }\n } catch {\n // if view.hasFocus fails (view not mounted yet)\n // we will return false because there's nothing to focus\n return false\n }\n\n // we don’t try to resolve a NodeSelection or CellSelection\n if (dispatch && position === null && !isTextSelection(editor.state.selection)) {\n delayedFocus()\n return true\n }\n\n // pass through tr.doc instead of editor.state.doc\n // since transactions could change the editors state before this command has been run\n const selection = resolveFocusPosition(tr.doc, position) || editor.state.selection\n const isSameSelection = editor.state.selection.eq(selection)\n\n if (dispatch) {\n if (!isSameSelection) {\n tr.setSelection(selection)\n }\n\n // `tr.setSelection` resets the stored marks\n // so we’ll restore them if the selection is the same as before\n if (isSameSelection && tr.storedMarks) {\n tr.setStoredMarks(tr.storedMarks)\n }\n\n delayedFocus()\n }\n\n return true\n }\n","import type { CommandProps, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n forEach: {\n /**\n * Loop through an array of items.\n */\n forEach: <T>(\n items: T[],\n fn: (\n item: T,\n props: CommandProps & {\n index: number\n },\n ) => boolean,\n ) => ReturnType\n }\n }\n}\n\nexport const forEach: RawCommands['forEach'] = (items, fn) => props => {\n return items.every((item, index) => fn(item, { ...props, index }))\n}\n","import type { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\n\nimport type { Content, RawCommands } from '../types.js'\n\nexport interface InsertContentOptions {\n /**\n * Options for parsing the content.\n */\n parseOptions?: ParseOptions\n\n /**\n * Whether to update the selection after inserting the content.\n */\n updateSelection?: boolean\n applyInputRules?: boolean\n applyPasteRules?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n insertContent: {\n /**\n * Insert a node or string of HTML at the current position.\n * @example editor.commands.insertContent('<h1>Example</h1>')\n * @example editor.commands.insertContent('<h1>Example</h1>', { updateSelection: false })\n */\n insertContent: (\n /**\n * The ProseMirror content to insert.\n */\n value: Content | ProseMirrorNode | Fragment,\n\n /**\n * Optional options\n */\n options?: InsertContentOptions,\n ) => ReturnType\n }\n }\n}\n\nexport const insertContent: RawCommands['insertContent'] =\n (value, options) =>\n ({ tr, commands }) => {\n return commands.insertContentAt(\n { from: tr.selection.from, to: tr.selection.to },\n value,\n options,\n )\n }\n","const removeWhitespaces = (node: HTMLElement) => {\n const children = node.childNodes\n\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i]\n\n if (child.nodeType === 3 && child.nodeValue && /^(\\n\\s\\s|\\n)$/.test(child.nodeValue)) {\n node.removeChild(child)\n } else if (child.nodeType === 1) {\n removeWhitespaces(child as HTMLElement)\n }\n }\n\n return node\n}\n\nexport function elementFromString(value: string): HTMLElement {\n if (typeof window === 'undefined') {\n throw new Error(\n '[tiptap error]: there is no window object available, so this function cannot be used',\n )\n }\n // add a wrapper to preserve leading and trailing whitespace\n const wrappedValue = `<body>${value}</body>`\n\n const html = new window.DOMParser().parseFromString(wrappedValue, 'text/html').body\n\n return removeWhitespaces(html)\n}\n","import type { ParseOptions } from '@tiptap/pm/model'\nimport { DOMParser, Fragment, Node as ProseMirrorNode, Schema } from '@tiptap/pm/model'\n\nimport type { Content } from '../types.js'\nimport { elementFromString } from '../utilities/elementFromString.js'\n\nexport type CreateNodeFromContentOptions = {\n slice?: boolean\n parseOptions?: ParseOptions\n errorOnInvalidContent?: boolean\n}\n\n/**\n * Takes a JSON or HTML content and creates a Prosemirror node or fragment from it.\n * @param content The JSON or HTML content to create the node from\n * @param schema The Prosemirror schema to use for the node\n * @param options Options for the parser\n * @returns The created Prosemirror node or fragment\n */\nexport function createNodeFromContent(\n content: Content | ProseMirrorNode | Fragment,\n schema: Schema,\n options?: CreateNodeFromContentOptions,\n): ProseMirrorNode | Fragment {\n if (content instanceof ProseMirrorNode || content instanceof Fragment) {\n return content\n }\n options = {\n slice: true,\n parseOptions: {},\n ...options,\n }\n\n const isJSONContent = typeof content === 'object' && content !== null\n const isTextContent = typeof content === 'string'\n\n if (isJSONContent) {\n try {\n const isArrayContent = Array.isArray(content) && content.length > 0\n\n // if the JSON Content is an array of nodes, create a fragment for each node\n if (isArrayContent) {\n return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)))\n }\n\n const node = schema.nodeFromJSON(content)\n\n if (options.errorOnInvalidContent) {\n node.check()\n }\n\n return node\n } catch (error) {\n if (options.errorOnInvalidContent) {\n throw new Error('[tiptap error]: Invalid JSON content', { cause: error as Error })\n }\n\n console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error)\n\n return createNodeFromContent('', schema, options)\n }\n }\n\n if (isTextContent) {\n // Check for invalid content\n if (options.errorOnInvalidContent) {\n let hasInvalidContent = false\n let invalidContent = ''\n\n // A copy of the current schema with a catch-all node at the end\n const contentCheckSchema = new Schema({\n topNode: schema.spec.topNode,\n marks: schema.spec.marks,\n // Prosemirror's schemas are executed such that: the last to execute, matches last\n // This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle\n nodes: schema.spec.nodes.append({\n __tiptap__private__unknown__catch__all__node: {\n content: 'inline*',\n group: 'block',\n parseDOM: [\n {\n tag: '*',\n getAttrs: e => {\n // If this is ever called, we know that the content has something that we don't know how to handle in the schema\n hasInvalidContent = true\n // Try to stringify the element for a more helpful error message\n invalidContent = typeof e === 'string' ? e : e.outerHTML\n return null\n },\n },\n ],\n },\n }),\n })\n\n if (options.slice) {\n DOMParser.fromSchema(contentCheckSchema).parseSlice(\n elementFromString(content),\n options.parseOptions,\n )\n } else {\n DOMParser.fromSchema(contentCheckSchema).parse(\n elementFromString(content),\n options.parseOptions,\n )\n }\n\n if (options.errorOnInvalidContent && hasInvalidContent) {\n throw new Error('[tiptap error]: Invalid HTML content', {\n cause: new Error(`Invalid element found: ${invalidContent}`),\n })\n }\n }\n\n const parser = DOMParser.fromSchema(schema)\n\n if (options.slice) {\n return parser.parseSlice(elementFromString(content), options.parseOptions).content\n }\n\n return parser.parse(elementFromString(content), options.parseOptions)\n }\n\n return createNodeFromContent('', schema, options)\n}\n","import type { Transaction } from '@tiptap/pm/state'\nimport { Selection } from '@tiptap/pm/state'\nimport { ReplaceAroundStep, ReplaceStep } from '@tiptap/pm/transform'\n\n// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466\nexport function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {\n const last = tr.steps.length - 1\n\n if (last < startLen) {\n return\n }\n\n const step = tr.steps[last]\n\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\n return\n }\n\n const map = tr.mapping.maps[last]\n let end = 0\n\n map.forEach((_from, _to, _newFrom, newTo) => {\n if (end === 0) {\n end = newTo\n }\n })\n\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias))\n}\n","import type { Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\nimport { Fragment } from '@tiptap/pm/model'\n\nimport { createNodeFromContent } from '../helpers/createNodeFromContent.js'\nimport { selectionToInsertionEnd } from '../helpers/selectionToInsertionEnd.js'\nimport type { Content, Range, RawCommands } from '../types.js'\n\nexport interface InsertContentAtOptions {\n /**\n * Options for parsing the content.\n */\n parseOptions?: ParseOptions\n\n /**\n * Whether to update the selection after inserting the content.\n */\n updateSelection?: boolean\n\n /**\n * Whether to apply input rules after inserting the content.\n */\n applyInputRules?: boolean\n\n /**\n * Whether to apply paste rules after inserting the content.\n */\n applyPasteRules?: boolean\n\n /**\n * Whether to throw an error if the content is invalid.\n */\n errorOnInvalidContent?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n insertContentAt: {\n /**\n * Insert a node or string of HTML at a specific position.\n * @example editor.commands.insertContentAt(0, '<h1>Example</h1>')\n */\n insertContentAt: (\n /**\n * The position to insert the content at.\n */\n position: number | Range,\n\n /**\n * The ProseMirror content to insert.\n */\n value: Content | ProseMirrorNode | Fragment,\n\n /**\n * Optional options\n */\n options?: InsertContentAtOptions,\n ) => ReturnType\n }\n }\n}\n\nconst isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {\n return !('type' in nodeOrFragment)\n}\n\nexport const insertContentAt: RawCommands['insertContentAt'] =\n (position, value, options) =>\n ({ tr, dispatch, editor }) => {\n if (dispatch) {\n options = {\n parseOptions: editor.options.parseOptions,\n updateSelection: true,\n applyInputRules: false,\n applyPasteRules: false,\n ...options,\n }\n\n let content: Fragment | ProseMirrorNode\n\n const emitContentError = (error: Error) => {\n editor.emit('contentError', {\n editor,\n error,\n disableCollaboration: () => {\n if (\n 'collaboration' in editor.storage &&\n typeof editor.storage.collaboration === 'object' &&\n editor.storage.collaboration\n ) {\n ;(editor.storage.collaboration as any).isDisabled = true\n }\n },\n })\n }\n\n const parseOptions: ParseOptions = {\n preserveWhitespace: 'full',\n ...options.parseOptions,\n }\n\n // If `emitContentError` is enabled, we want to check the content for errors\n // but ignore them (do not remove the invalid content from the document)\n if (\n !options.errorOnInvalidContent &&\n !editor.options.enableContentCheck &&\n editor.options.emitContentError\n ) {\n try {\n createNodeFromContent(value, editor.schema, {\n parseOptions,\n errorOnInvalidContent: true,\n })\n } catch (e) {\n emitContentError(e as Error)\n }\n }\n\n try {\n content = createNodeFromContent(value, editor.schema, {\n parseOptions,\n errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,\n })\n } catch (e) {\n emitContentError(e as Error)\n return false\n }\n\n let { from, to } =\n typeof position === 'number'\n ? { from: position, to: position }\n : { from: position.from, to: position.to }\n\n let isOnlyTextContent = true\n let isOnlyBlockContent = true\n const nodes = isFragment(content) ? content : [content]\n\n nodes.forEach(node => {\n // check if added node is valid\n node.check()\n\n isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false\n\n isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false\n })\n\n // check if we can replace the wrapping node by\n // the newly inserted content\n // example:\n // replace an empty paragraph by an inserted image\n // instead of inserting the image below the paragraph\n if (from === to && isOnlyBlockContent) {\n const { parent } = tr.doc.resolve(from)\n const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount\n\n if (isEmptyTextBlock) {\n from -= 1\n to += 1\n }\n }\n\n let newContent\n\n // if there is only plain text we have to use `insertText`\n // because this will keep the current marks\n if (isOnlyTextContent) {\n // if value is string, we can use it directly\n // otherwise if it is an array, we have to join it\n if (Array.isArray(value)) {\n newContent = value.map(v => v.text || '').join('')\n } else if (value instanceof Fragment) {\n let text = ''\n\n value.forEach(node => {\n if (node.text) {\n text += node.text\n }\n })\n\n newContent = text\n } else if (typeof value === 'object' && !!value && !!value.text) {\n newContent = value.text\n } else {\n newContent = value as string\n }\n\n tr.insertText(newContent, from, to)\n } else {\n newContent = content\n\n const $from = tr.doc.resolve(from)\n const $fromNode = $from.node()\n const fromSelectionAtStart = $from.parentOffset === 0\n const isTextSelection = $fromNode.isText || $fromNode.isTextblock\n const hasContent = $fromNode.content.size > 0\n\n if (fromSelectionAtStart && isTextSelection && hasContent && isOnlyBlockContent) {\n from = Math.max(0, from - 1)\n }\n\n tr.replaceWith(from, to, newContent)\n }\n\n // set cursor at end of inserted content\n if (options.updateSelection) {\n selectionToInsertionEnd(tr, tr.steps.length - 1, -1)\n }\n\n if (options.applyInputRules) {\n tr.setMeta('applyInputRules', { from, text: newContent })\n }\n\n if (options.applyPasteRules) {\n tr.setMeta('applyPasteRules', { from, text: newContent })\n }\n }\n\n return true\n }\n","import {\n joinBackward as originalJoinBackward,\n joinDown as originalJoinDown,\n joinForward as originalJoinForward,\n joinUp as originalJoinUp,\n} from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinUp: {\n /**\n * Join the selected block or, if there is a text selection, the closest ancestor block of the selection that can be joined, with the sibling above it.\n * @example editor.commands.joinUp()\n */\n joinUp: () => ReturnType\n }\n joinDown: {\n /**\n * Join the selected block, or the closest ancestor of the selection that can be joined, with the sibling after it.\n * @example editor.commands.joinDown()\n */\n joinDown: () => ReturnType\n }\n joinBackward: {\n /**\n * If the selection is empty and at the start of a textblock, try to reduce the distance between that block and the one before it—if there's a block directly before it that can be joined, join them.\n * If not, try to move the selected block closer to the next one in the document structure by lifting it out of its\n * parent or moving it into a parent of the previous block. Will use the view for accurate (bidi-aware) start-of-textblock detection if given.\n * @example editor.commands.joinBackward()\n */\n joinBackward: () => ReturnType\n }\n joinForward: {\n /**\n * If the selection is empty and the cursor is at the end of a textblock, try to reduce or remove the boundary between that block and the one after it,\n * either by joining them or by moving the other block closer to this one in the tree structure.\n * Will use the view for accurate start-of-textblock detection if given.\n * @example editor.commands.joinForward()\n */\n joinForward: () => ReturnType\n }\n }\n}\n\nexport const joinUp: RawCommands['joinUp'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinUp(state, dispatch)\n }\n\nexport const joinDown: RawCommands['joinDown'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinDown(state, dispatch)\n }\n\nexport const joinBackward: RawCommands['joinBackward'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinBackward(state, dispatch)\n }\n\nexport const joinForward: RawCommands['joinForward'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinForward(state, dispatch)\n }\n","import { joinPoint } from '@tiptap/pm/transform'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinItemBackward: {\n /**\n * Join two items backward.\n * @example editor.commands.joinItemBackward()\n */\n joinItemBackward: () => ReturnType\n }\n }\n}\n\nexport const joinItemBackward: RawCommands['joinItemBackward'] =\n () =>\n ({ state, dispatch, tr }) => {\n try {\n const point = joinPoint(state.doc, state.selection.$from.pos, -1)\n\n if (point === null || point === undefined) {\n return false\n }\n\n tr.join(point, 2)\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n } catch {\n return false\n }\n }\n","import { joinPoint } from '@tiptap/pm/transform'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinItemForward: {\n /**\n * Join two items Forwards.\n * @example editor.commands.joinItemForward()\n */\n joinItemForward: () => ReturnType\n }\n }\n}\n\nexport const joinItemForward: RawCommands['joinItemForward'] =\n () =>\n ({ state, dispatch, tr }) => {\n try {\n const point = joinPoint(state.doc, state.selection.$from.pos, +1)\n\n if (point === null || point === undefined) {\n return false\n }\n\n tr.join(point, 2)\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n } catch {\n return false\n }\n }\n","import { joinTextblockBackward as originalCommand } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinTextblockBackward: {\n /**\n * A more limited form of joinBackward that only tries to join the current textblock to the one before it, if the cursor is at the start of a textblock.\n */\n joinTextblockBackward: () => ReturnType\n }\n }\n}\n\nexport const joinTextblockBackward: RawCommands['joinTextblockBackward'] =\n () =>\n ({ state, dispatch }) => {\n return originalCommand(state, dispatch)\n }\n","import { joinTextblockForward as originalCommand } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinTextblockForward: {\n /**\n * A more limited form of joinForward that only tries to join the current textblock to the one after it, if the cursor is at the end of a textblock.\n */\n joinTextblockForward: () => ReturnType\n }\n }\n}\n\nexport const joinTextblockForward: RawCommands['joinTextblockForward'] =\n () =>\n ({ state, dispatch }) => {\n return originalCommand(state, dispatch)\n }\n","export function isMacOS(): boolean {\n return typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false\n}\n","import type { RawCommands } from '../types.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isMacOS } from '../utilities/isMacOS.js'\n\nfunction normalizeKeyName(name: string) {\n const parts = name.split(/-(?!$)/)\n let result = parts[parts.length - 1]\n\n if (result === 'Space') {\n result = ' '\n }\n\n let alt\n let ctrl\n let shift\n let meta\n\n for (let i = 0; i < parts.length - 1; i += 1) {\n const mod = parts[i]\n\n if (/^(cmd|meta|m)$/i.test(mod)) {\n meta = true\n } else if (/^a(lt)?$/i.test(mod)) {\n alt = true\n } else if (/^(c|ctrl|control)$/i.test(mod)) {\n ctrl = true\n } else if (/^s(hift)?$/i.test(mod)) {\n shift = true\n } else if (/^mod$/i.test(mod)) {\n if (isiOS() || isMacOS()) {\n meta = true\n } else {\n ctrl = true\n }\n } else {\n throw new Error(`Unrecognized modifier name: ${mod}`)\n }\n }\n\n if (alt) {\n result = `Alt-${result}`\n }\n\n if (ctrl) {\n result = `Ctrl-${result}`\n }\n\n if (meta) {\n result = `Meta-${result}`\n }\n\n if (shift) {\n result = `Shift-${result}`\n }\n\n return result\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n keyboardShortcut: {\n /**\n * Trigger a keyboard shortcut.\n * @param name The name of the keyboard shortcut.\n * @example editor.commands.keyboardShortcut('Mod-b')\n */\n keyboardShortcut: (name: string) => ReturnType\n }\n }\n}\n\nexport const keyboardShortcut: RawCommands['keyboardShortcut'] =\n name =>\n ({ editor, view, tr, dispatch }) => {\n const keys = normalizeKeyName(name).split(/-(?!$)/)\n const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item))\n const event = new KeyboardEvent('keydown', {\n key: key === 'Space' ? ' ' : key,\n altKey: keys.includes('Alt'),\n ctrlKey: keys.includes('Ctrl'),\n metaKey: keys.includes('Meta'),\n shiftKey: keys.includes('Shift'),\n bubbles: true,\n cancelable: true,\n })\n\n const capturedTransaction = editor.captureTransaction(() => {\n view.someProp('handleKeyDown', f => f(view, event))\n })\n\n capturedTransaction?.steps.forEach(step => {\n const newStep = step.map(tr.mapping)\n\n if (newStep && dispatch) {\n tr.maybeStep(newStep)\n }\n })\n\n return true\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport type { NodeRange } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\nimport { getNodeType } from './getNodeType.js'\n\nexport function isNodeActive(\n state: EditorState,\n typeOrName: NodeType | string | null,\n attributes: Record<string, any> = {},\n): boolean {\n const { from, to, empty } = state.selection\n const type = typeOrName ? getNodeType(typeOrName, state.schema) : null\n\n const nodeRanges: NodeRange[] = []\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n const relativeFrom = Math.max(from, pos)\n const relativeTo = Math.min(to, pos + node.nodeSize)\n\n nodeRanges.push({\n node,\n from: relativeFrom,\n to: relativeTo,\n })\n })\n\n const selectionRange = to - from\n const matchedNodeRanges = nodeRanges\n .filter(nodeRange => {\n if (!type) {\n return true\n }\n\n return type.name === nodeRange.node.type.name\n })\n .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }))\n\n if (empty) {\n return !!matchedNodeRanges.length\n }\n\n const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0)\n\n return range >= selectionRange\n}\n","import { lift as originalLift } from '@tiptap/pm/commands'\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n lift: {\n /**\n * Removes an existing wrap if possible lifting the node out of it\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.lift('paragraph')\n * @example editor.commands.lift('heading', { level: 1 })\n */\n lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const lift: RawCommands['lift'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (!isActive) {\n return false\n }\n\n return originalLift(state, dispatch)\n }\n","import { liftEmptyBlock as originalLiftEmptyBlock } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n liftEmptyBlock: {\n /**\n * If the cursor is in an empty textblock that can be lifted, lift the block.\n * @example editor.commands.liftEmptyBlock()\n */\n liftEmptyBlock: () => ReturnType\n }\n }\n}\n\nexport const liftEmptyBlock: RawCommands['liftEmptyBlock'] =\n () =>\n ({ state, dispatch }) => {\n return originalLiftEmptyBlock(state, dispatch)\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport { liftListItem as originalLiftListItem } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n liftListItem: {\n /**\n * Create a command to lift the list item around the selection up into a wrapping list.\n * @param typeOrName The type or name of the node.\n * @example editor.commands.liftListItem('listItem')\n */\n liftListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const liftListItem: RawCommands['liftListItem'] =\n typeOrName =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalLiftListItem(type)(state, dispatch)\n }\n","import { newlineInCode as originalNewlineInCode } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n newlineInCode: {\n /**\n * Add a newline character in code.\n * @example editor.commands.newlineInCode()\n */\n newlineInCode: () => ReturnType\n }\n }\n}\n\nexport const newlineInCode: RawCommands['newlineInCode'] =\n () =>\n ({ state, dispatch }) => {\n return originalNewlineInCode(state, dispatch)\n }\n","import type { Schema } from '@tiptap/pm/model'\n\n/**\n * Get the type of a schema item by its name.\n * @param name The name of the schema item\n * @param schema The Prosemiror schema to search in\n * @returns The type of the schema item (`node` or `mark`), or null if it doesn't exist\n */\nexport function getSchemaTypeNameByName(name: string, schema: Schema): 'node' | 'mark' | null {\n if (schema.nodes[name]) {\n return 'node'\n }\n\n if (schema.marks[name]) {\n return 'mark'\n }\n\n return null\n}\n","/**\n * Remove a property or an array of properties from an object\n * @param obj Object\n * @param key Key to remove\n */\nexport function deleteProps(\n obj: Record<string, any>,\n propOrProps: string | string[],\n): Record<string, any> {\n const props = typeof propOrProps === 'string' ? [propOrProps] : propOrProps\n\n return Object.keys(obj).reduce((newObj: Record<string, any>, prop) => {\n if (!props.includes(prop)) {\n newObj[prop] = obj[prop]\n }\n\n return newObj\n }, {})\n}\n","import type { MarkType, NodeType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js'\nimport type { RawCommands } from '../types.js'\nimport { deleteProps } from '../utilities/deleteProps.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n resetAttributes: {\n /**\n * Resets some node attributes to the default value.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node to reset.\n * @example editor.commands.resetAttributes('heading', 'level')\n */\n resetAttributes: (\n typeOrName: string | NodeType | MarkType,\n attributes: string | string[],\n ) => ReturnType\n }\n }\n}\n\nexport const resetAttributes: RawCommands['resetAttributes'] =\n (typeOrName, attributes) =>\n ({ tr, state, dispatch }) => {\n let nodeType: NodeType | null = null\n let markType: MarkType | null = null\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (!schemaType) {\n return false\n }\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName as NodeType, state.schema)\n }\n\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName as MarkType, state.schema)\n }\n\n let canReset = false\n\n tr.selection.ranges.forEach(range => {\n state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (nodeType && nodeType === node.type) {\n canReset = true\n\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))\n }\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach(mark => {\n if (markType === mark.type) {\n canReset = true\n\n if (dispatch) {\n tr.addMark(\n pos,\n pos + node.nodeSize,\n markType.create(deleteProps(mark.attrs, attributes)),\n )\n }\n }\n })\n }\n })\n })\n\n return canReset\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n scrollIntoView: {\n /**\n * Scroll the selection into view.\n * @example editor.commands.scrollIntoView()\n */\n scrollIntoView: () => ReturnType\n }\n }\n}\n\nexport const scrollIntoView: RawCommands['scrollIntoView'] =\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n tr.scrollIntoView()\n }\n\n return true\n }\n","import { AllSelection } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectAll: {\n /**\n * Select the whole document.\n * @example editor.commands.selectAll()\n */\n selectAll: () => ReturnType\n }\n }\n}\n\nexport const selectAll: RawCommands['selectAll'] =\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const selection = new AllSelection(tr.doc)\n\n tr.setSelection(selection)\n }\n\n return true\n }\n","import { selectNodeBackward as originalSelectNodeBackward } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectNodeBackward: {\n /**\n * Select a node backward.\n * @example editor.commands.selectNodeBackward()\n */\n selectNodeBackward: () => ReturnType\n }\n }\n}\n\nexport const selectNodeBackward: RawCommands['selectNodeBackward'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectNodeBackward(state, dispatch)\n }\n","import { selectNodeForward as originalSelectNodeForward } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectNodeForward: {\n /**\n * Select a node forward.\n * @example editor.commands.selectNodeForward()\n */\n selectNodeForward: () => ReturnType\n }\n }\n}\n\nexport const selectNodeForward: RawCommands['selectNodeForward'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectNodeForward(state, dispatch)\n }\n","import { selectParentNode as originalSelectParentNode } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectParentNode: {\n /**\n * Select the parent node.\n * @example editor.commands.selectParentNode()\n */\n selectParentNode: () => ReturnType\n }\n }\n}\n\nexport const selectParentNode: RawCommands['selectParentNode'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectParentNode(state, dispatch)\n }\n","// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nimport { selectTextblockEnd as originalSelectTextblockEnd } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectTextblockEnd: {\n /**\n * Moves the cursor to the end of current text block.\n * @example editor.commands.selectTextblockEnd()\n */\n selectTextblockEnd: () => ReturnType\n }\n }\n}\n\nexport const selectTextblockEnd: RawCommands['selectTextblockEnd'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectTextblockEnd(state, dispatch)\n }\n","// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nimport { selectTextblockStart as originalSelectTextblockStart } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectTextblockStart: {\n /**\n * Moves the cursor to the start of current text block.\n * @example editor.commands.selectTextblockStart()\n */\n selectTextblockStart: () => ReturnType\n }\n }\n}\n\nexport const selectTextblockStart: RawCommands['selectTextblockStart'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectTextblockStart(state, dispatch)\n }\n","import type { Fragment, Node as ProseMirrorNode, ParseOptions, Schema } from '@tiptap/pm/model'\n\nimport type { Content } from '../types.js'\nimport { createNodeFromContent } from './createNodeFromContent.js'\n\n/**\n * Create a new Prosemirror document node from content.\n * @param content The JSON or HTML content to create the document from\n * @param schema The Prosemirror schema to use for the document\n * @param parseOptions Options for the parser\n * @returns The created Prosemirror document node\n */\nexport function createDocument(\n content: Content | ProseMirrorNode | Fragment,\n schema: Schema,\n parseOptions: ParseOptions = {},\n options: { errorOnInvalidContent?: boolean } = {},\n): ProseMirrorNode {\n return createNodeFromContent(content, schema, {\n slice: false,\n parseOptions,\n errorOnInvalidContent: options.errorOnInvalidContent,\n }) as ProseMirrorNode\n}\n","import type { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\n\nimport { createDocument } from '../helpers/createDocument.js'\nimport type { Content, RawCommands } from '../types.js'\n\nexport interface SetContentOptions {\n /**\n * Options for parsing the content.\n * @default {}\n */\n parseOptions?: ParseOptions\n\n /**\n * Whether to throw an error if the content is invalid.\n */\n errorOnInvalidContent?: boolean\n\n /**\n * Whether to emit an update event.\n * @default true\n */\n emitUpdate?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setContent: {\n /**\n * Replace the whole document with new content.\n * @param content The new content.\n * @param emitUpdate Whether to emit an update event.\n * @param parseOptions Options for parsing the content.\n * @example editor.commands.setContent('<p>Example text</p>')\n */\n setContent: (\n /**\n * The new content.\n */\n content: Content | Fragment | ProseMirrorNode,\n\n /**\n * Options for `setContent`.\n */\n options?: SetContentOptions,\n ) => ReturnType\n }\n }\n}\n\nexport const setContent: RawCommands['setContent'] =\n (content, { errorOnInvalidContent, emitUpdate = true, parseOptions = {} } = {}) =>\n ({ editor, tr, dispatch, commands }) => {\n const { doc } = tr\n\n // This is to keep backward compatibility with the previous behavior\n // TODO remove this in the next major version\n if (parseOptions.preserveWhitespace !== 'full') {\n const document = createDocument(content, editor.schema, parseOptions, {\n errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,\n })\n\n if (dispatch) {\n tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)\n }\n return true\n }\n\n if (dispatch) {\n tr.setMeta('preventUpdate', !emitUpdate)\n }\n\n return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {\n parseOptions,\n errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,\n })\n }\n","import type { Mark, MarkType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport { getMarkType } from './getMarkType.js'\n\nexport function getMarkAttributes(\n state: EditorState,\n typeOrName: string | MarkType,\n): Record<string, any> {\n const type = getMarkType(typeOrName, state.schema)\n const { from, to, empty } = state.selection\n const marks: Mark[] = []\n\n if (empty) {\n if (state.storedMarks) {\n marks.push(...state.storedMarks)\n }\n\n marks.push(...state.selection.$head.marks())\n } else {\n state.doc.nodesBetween(from, to, node => {\n marks.push(...node.marks)\n })\n }\n\n const mark = marks.find(markItem => markItem.type.name === type.name)\n\n if (!mark) {\n return {}\n }\n\n return { ...mark.attrs }\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { Transform } from '@tiptap/pm/transform'\n\n/**\n * Returns a new `Transform` based on all steps of the passed transactions.\n * @param oldDoc The Prosemirror node to start from\n * @param transactions The transactions to combine\n * @returns A new `Transform` with all steps of the passed transactions\n */\nexport function combineTransactionSteps(\n oldDoc: ProseMirrorNode,\n transactions: Transaction[],\n): Transform {\n const transform = new Transform(oldDoc)\n\n transactions.forEach(transaction => {\n transaction.steps.forEach(step => {\n transform.step(step)\n })\n })\n\n return transform\n}\n","import type { ContentMatch, NodeType } from '@tiptap/pm/model'\n\n/**\n * Gets the default block type at a given match\n * @param match The content match to get the default block type from\n * @returns The default block type or null\n */\nexport function defaultBlockAt(match: ContentMatch): NodeType | null {\n for (let i = 0; i < match.edgeCount; i += 1) {\n const { type } = match.edge(i)\n\n if (type.isTextblock && !type.hasRequiredAttrs()) {\n return type\n }\n }\n\n return null\n}\n","import type { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'\n\nimport type { Predicate } from '../types.js'\n\n/**\n * Finds the closest parent node to a resolved position that matches a predicate.\n * @param $pos The resolved position to search from\n * @param predicate The predicate to match\n * @returns The closest parent node to the resolved position that matches the predicate\n * @example ```js\n * findParentNodeClosestToPos($from, node => node.type.name === 'paragraph')\n * ```\n */\nexport function findParentNodeClosestToPos(\n $pos: ResolvedPos,\n predicate: Predicate,\n):\n | {\n pos: number\n start: number\n depth: number\n node: ProseMirrorNode\n }\n | undefined {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i)\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node,\n }\n }\n }\n}\n","import type { Selection } from '@tiptap/pm/state'\n\nimport type { Predicate } from '../types.js'\nimport { findParentNodeClosestToPos } from './findParentNodeClosestToPos.js'\n\n/**\n * Finds the closest parent node to the current selection that matches a predicate.\n * @param predicate The predicate to match\n * @returns A command that finds the closest parent node to the current selection that matches the predicate\n * @example ```js\n * findParentNode(node => node.type.name === 'paragraph')\n * ```\n */\nexport function findParentNode(\n predicate: Predicate,\n): (selection: Selection) => ReturnType<typeof findParentNodeClosestToPos> {\n return (selection: Selection) => findParentNodeClosestToPos(selection.$from, predicate)\n}\n","import type { ExtensionConfig } from '../Extension.js'\nimport type { MarkConfig } from '../Mark.js'\nimport type { NodeConfig } from '../Node.js'\nimport type { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types.js'\n\n/**\n * Returns a field from an extension\n * @param extension The Tiptap extension\n * @param field The field, for example `renderHTML` or `priority`\n * @param context The context object that should be passed as `this` into the function\n * @returns The field value\n */\nexport function getExtensionField<T = any, E extends AnyExtension = any>(\n extension: E,\n field: keyof ExtensionConfig | keyof MarkConfig | keyof NodeConfig,\n context?: Omit<MaybeThisParameterType<T>, 'parent'>,\n): RemoveThis<T> {\n if (extension.config[field as keyof typeof extension.config] === undefined && extension.parent) {\n return getExtensionField(extension.parent, field, context)\n }\n\n if (typeof extension.config[field as keyof typeof extension.config] === 'function') {\n const value = (extension.config[field as keyof typeof extension.config] as any).bind({\n ...context,\n parent: extension.parent ? getExtensionField(extension.parent, field, context) : null,\n })\n\n return value\n }\n\n return extension.config[field as keyof typeof extension.config] as RemoveThis<T>\n}\n","// oxlint-disable-next-lineno-unsafe-function-type\nexport function isFunction(value: any): value is Function {\n return typeof value === 'function'\n}\n","import type { MaybeReturnType } from '../types.js'\nimport { isFunction } from './isFunction.js'\n\n/**\n * Optionally calls `value` as a function.\n * Otherwise it is returned directly.\n * @param value Function or any value.\n * @param context Optional context to bind to function.\n * @param props Optional props to pass to function.\n */\nexport function callOrReturn<T>(\n value: T,\n context: any = undefined,\n ...props: any[]\n): MaybeReturnType<T> {\n if (isFunction(value)) {\n if (context) {\n return value.bind(context)(...props)\n }\n\n return value(...props)\n }\n\n return value as MaybeReturnType<T>\n}\n","import type { Extension } from '../Extension.js'\nimport type { Mark } from '../Mark.js'\nimport type { Node } from '../Node.js'\nimport type { Extensions } from '../types.js'\n\nexport function splitExtensions(extensions: Extensions) {\n const baseExtensions = extensions.filter(\n extension => extension.type === 'extension',\n ) as Extension[]\n const nodeExtensions = extensions.filter(extension => extension.type === 'node') as Node[]\n const markExtensions = extensions.filter(extension => extension.type === 'mark') as Mark[]\n\n return {\n baseExtensions,\n nodeExtensions,\n markExtensions,\n }\n}\n","/** Splits a CSS style string into declarations, ignoring semicolons inside quotes/parentheses. */\nfunction splitStyleDeclarations(styles: string): string[] {\n const result: string[] = []\n\n let current = ''\n let inSingleQuote = false\n let inDoubleQuote = false\n let parenDepth = 0\n\n const length = styles.length\n for (let i = 0; i < length; i += 1) {\n const char = styles[i]\n if (char === \"'\" && !inDoubleQuote) {\n inSingleQuote = !inSingleQuote\n current += char\n continue\n }\n if (char === '\"' && !inSingleQuote) {\n inDoubleQuote = !inDoubleQuote\n current += char\n continue\n }\n if (!inSingleQuote && !inDoubleQuote) {\n if (char === '(') {\n parenDepth += 1\n current += char\n continue\n }\n if (char === ')' && parenDepth > 0) {\n parenDepth -= 1\n current += char\n continue\n }\n if (char === ';' && parenDepth === 0) {\n result.push(current)\n current = ''\n continue\n }\n }\n current += char\n }\n if (current) {\n result.push(current)\n }\n\n return result\n}\n\n/** Yields property/value pairs from a style string. */\nfunction parseStyleEntries(styles: string | undefined): [property: string, value: string][] {\n const pairs: [string, string][] = []\n\n const declarations = splitStyleDeclarations(styles || '')\n const numDeclarations = declarations.length\n\n for (let i = 0; i < numDeclarations; i += 1) {\n const declaration = declarations[i]\n\n const firstColonIndex = declaration.indexOf(':')\n if (firstColonIndex === -1) {\n continue\n }\n\n const property = declaration.slice(0, firstColonIndex).trim()\n const value = declaration.slice(firstColonIndex + 1).trim()\n if (property && value) {\n pairs.push([property, value])\n }\n }\n\n return pairs\n}\n\nexport function mergeAttributes(...objects: Record<string, any>[]): Record<string, any> {\n return objects\n .filter(item => !!item)\n .reduce((items, item) => {\n const mergedAttributes = { ...items }\n\n Object.entries(item).forEach(([key, value]) => {\n const exists = mergedAttributes[key]\n\n if (!exists) {\n mergedAttributes[key] = value\n\n return\n }\n\n if (key === 'class') {\n const valueClasses: string[] = value ? String(value).split(' ') : []\n const existingClasses: string[] = mergedAttributes[key]\n ? mergedAttributes[key].split(' ')\n : []\n\n const insertClasses = valueClasses.filter(\n valueClass => !existingClasses.includes(valueClass),\n )\n\n mergedAttributes[key] = [...existingClasses, ...insertClasses].join(' ')\n } else if (key === 'style') {\n const styleMap = new Map([\n ...parseStyleEntries(mergedAttributes[key]),\n ...parseStyleEntries(value),\n ])\n\n mergedAttributes[key] = Array.from(styleMap.entries())\n .map(([property, val]) => `${property}: ${val}`)\n .join('; ')\n } else {\n mergedAttributes[key] = value\n }\n })\n\n return mergedAttributes\n }, {})\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport type { Range, TextSerializer } from '../types.js'\n\n/**\n * Gets the text between two positions in a Prosemirror node\n * and serializes it using the given text serializers and block separator (see getText)\n * @param startNode The Prosemirror node to start from\n * @param range The range of the text to get\n * @param options Options for the text serializer & block separator\n * @returns The text between the two positions\n */\nexport function getTextBetween(\n startNode: ProseMirrorNode,\n range: Range,\n options?: {\n blockSeparator?: string\n textSerializers?: Record<string, TextSerializer>\n },\n): string {\n const { from, to } = range\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {}\n let text = ''\n\n startNode.nodesBetween(from, to, (node, pos, parent, index) => {\n if (node.isBlock && pos > from) {\n text += blockSeparator\n }\n\n const textSerializer = textSerializers?.[node.type.name]\n\n if (textSerializer) {\n if (parent) {\n text += textSerializer({\n node,\n pos,\n parent,\n index,\n range,\n })\n }\n // do not descend into child nodes when there exists a serializer\n return false\n }\n\n if (node.isText) {\n text += node?.text?.slice(Math.max(from, pos) - pos, to - pos) // oxlint-disable-line\n }\n })\n\n return text\n}\n","import type { Schema } from '@tiptap/pm/model'\n\nimport type { TextSerializer } from '../types.js'\n\n/**\n * Find text serializers `toText` in a Prosemirror schema\n * @param schema The Prosemirror schema to search in\n * @returns A record of text serializers by node name\n */\nexport function getTextSerializersFromSchema(schema: Schema): Record<string, TextSerializer> {\n return Object.fromEntries(\n Object.entries(schema.nodes)\n .filter(([, node]) => node.spec.toText)\n .map(([name, node]) => [name, node.spec.toText]),\n )\n}\n","/**\n * Removes duplicated values within an array.\n * Supports numbers, strings and objects.\n */\nexport function removeDuplicates<T>(array: T[], by = JSON.stringify): T[] {\n const seen: Record<any, any> = {}\n\n return array.filter(item => {\n const key = by(item)\n\n return Object.prototype.hasOwnProperty.call(seen, key) ? false : (seen[key] = true)\n })\n}\n","import type { Step, Transform } from '@tiptap/pm/transform'\n\nimport type { Range } from '../types.js'\nimport { removeDuplicates } from '../utilities/removeDuplicates.js'\n\nexport type ChangedRange = {\n oldRange: Range\n newRange: Range\n}\n\n/**\n * Removes duplicated ranges and ranges that are\n * fully captured by other ranges.\n */\nfunction simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {\n const uniqueChanges = removeDuplicates(changes)\n\n return uniqueChanges.length === 1\n ? uniqueChanges\n : uniqueChanges.filter((change, index) => {\n const rest = uniqueChanges.filter((_, i) => i !== index)\n\n return !rest.some(otherChange => {\n return (\n change.oldRange.from >= otherChange.oldRange.from &&\n change.oldRange.to <= otherChange.oldRange.to &&\n change.newRange.from >= otherChange.newRange.from &&\n change.newRange.to <= otherChange.newRange.to\n )\n })\n })\n}\n\n/**\n * Returns a list of changed ranges\n * based on the first and last state of all steps.\n */\nexport function getChangedRanges(transform: Transform): ChangedRange[] {\n const { mapping, steps } = transform\n const changes: ChangedRange[] = []\n\n mapping.maps.forEach((stepMap, index) => {\n const ranges: Range[] = []\n\n // This accounts for step changes where no range was actually altered\n // e.g. when setting a mark, node attribute, etc.\n // @ts-ignore\n if (!stepMap.ranges.length) {\n const { from, to } = steps[index] as Step & {\n from?: number\n to?: number\n }\n\n if (from === undefined || to === undefined) {\n return\n }\n\n ranges.push({ from, to })\n } else {\n stepMap.forEach((from, to) => {\n ranges.push({ from, to })\n })\n }\n\n ranges.forEach(({ from, to }) => {\n const newStart = mapping.slice(index).map(from, -1)\n const newEnd = mapping.slice(index).map(to)\n const oldStart = mapping.invert().map(newStart, -1)\n const oldEnd = mapping.invert().map(newEnd)\n\n changes.push({\n oldRange: {\n from: oldStart,\n to: oldEnd,\n },\n newRange: {\n from: newStart,\n to: newEnd,\n },\n })\n })\n })\n\n return simplifyChangedRanges(changes)\n}\n","import type { ExtensionAttribute } from '../types.js'\n\n/**\n * Return attributes of an extension that should be splitted by keepOnSplit flag\n * @param extensionAttributes Array of extension attributes\n * @param typeName The type of the extension\n * @param attributes The attributes of the extension\n * @returns The splitted attributes\n */\nexport function getSplittedAttributes(\n extensionAttributes: ExtensionAttribute[],\n typeName: string,\n attributes: Record<string, any>,\n): Record<string, any> {\n return Object.fromEntries(\n Object.entries(attributes).filter(([name]) => {\n const extensionAttribute = extensionAttributes.find(item => {\n return item.type === typeName && item.name === name\n })\n\n if (!extensionAttribute) {\n return false\n }\n\n return extensionAttribute.attribute.keepOnSplit\n }),\n )\n}\n","import type { MarkType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport type { MarkRange } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\nimport { getMarkType } from './getMarkType.js'\n\nexport function isMarkActive(\n state: EditorState,\n typeOrName: MarkType | string | null,\n attributes: Record<string, any> = {},\n): boolean {\n const { empty, ranges } = state.selection\n const type = typeOrName ? getMarkType(typeOrName, state.schema) : null\n\n if (empty) {\n return !!(state.storedMarks || state.selection.$from.marks())\n .filter(mark => {\n if (!type) {\n return true\n }\n\n return type.name === mark.type.name\n })\n .find(mark => objectIncludes(mark.attrs, attributes, { strict: false }))\n }\n\n let selectionRange = 0\n const markRanges: MarkRange[] = []\n\n ranges.forEach(({ $from, $to }) => {\n const from = $from.pos\n const to = $to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n // ignore selected text inside nodes whose schema disallows this mark type\n if (type && node.inlineContent && !node.type.allowsMarkType(type)) {\n return false\n }\n\n if (!node.isText && !node.marks.length) {\n return\n }\n\n const relativeFrom = Math.max(from, pos)\n const relativeTo = Math.min(to, pos + node.nodeSize)\n const range = relativeTo - relativeFrom\n\n selectionRange += range\n\n markRanges.push(\n ...node.marks.map(mark => ({\n mark,\n from: relativeFrom,\n to: relativeTo,\n })),\n )\n })\n })\n\n if (selectionRange === 0) {\n return false\n }\n\n // calculate range of matched mark\n const matchedRange = markRanges\n .filter(markRange => {\n if (!type) {\n return true\n }\n\n return type.name === markRange.mark.type.name\n })\n .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)\n\n // calculate range of marks that excludes the searched mark\n // for example `code` doesn’t allow any other marks\n const excludedRange = markRanges\n .filter(markRange => {\n if (!type) {\n return true\n }\n\n return markRange.mark.type !== type && markRange.mark.type.excludes(type)\n })\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)\n\n // we only include the result of `excludedRange`\n // if there is a match at all\n const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange\n\n return range >= selectionRange\n}\n","import { getExtensionField } from '../helpers/getExtensionField.js'\nimport type { NodeConfig } from '../index.js'\nimport type { Extensions } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\nimport { splitExtensions } from './splitExtensions.js'\n\nexport function isList(name: string, extensions: Extensions): boolean {\n const { nodeExtensions } = splitExtensions(extensions)\n const extension = nodeExtensions.find(item => item.name === name)\n\n if (!extension) {\n return false\n }\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n const group = callOrReturn(getExtensionField<NodeConfig['group']>(extension, 'group', context))\n\n if (typeof group !== 'string') {\n return false\n }\n\n return group.split(' ').includes('list')\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\n/**\n * Returns true if the given prosemirror node is empty.\n */\nexport function isNodeEmpty(\n node: ProseMirrorNode,\n {\n checkChildren = true,\n ignoreWhitespace = false,\n }: {\n /**\n * When true (default), it will also check if all children are empty.\n */\n checkChildren?: boolean\n /**\n * When true, it will ignore whitespace when checking for emptiness.\n */\n ignoreWhitespace?: boolean\n } = {},\n): boolean {\n if (ignoreWhitespace) {\n if (node.type.name === 'hardBreak') {\n // Hard breaks are considered empty\n return true\n }\n if (node.isText) {\n return !/\\S/.test(node.text ?? '')\n }\n }\n\n if (node.isText) {\n return !node.text\n }\n\n if (node.isAtom || node.isLeaf) {\n return false\n }\n\n if (node.content.childCount === 0) {\n return true\n }\n\n if (checkChildren) {\n let isContentEmpty = true\n\n node.content.forEach(childNode => {\n if (isContentEmpty === false) {\n // Exit early for perf\n return\n }\n\n if (!isNodeEmpty(childNode, { ignoreWhitespace, checkChildren })) {\n isContentEmpty = false\n }\n })\n\n return isContentEmpty\n }\n\n return false\n}\n","import type { MarkType, ResolvedPos } from '@tiptap/pm/model'\nimport type { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport { getMarkAttributes } from '../helpers/getMarkAttributes.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { isTextSelection } from '../helpers/index.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setMark: {\n /**\n * Add a mark with new attributes.\n * @param typeOrName The mark type or name.\n * @example editor.commands.setMark('bold', { level: 1 })\n */\n setMark: (typeOrName: string | MarkType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nfunction canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType) {\n const { selection } = tr\n let cursor: ResolvedPos | null = null\n\n if (isTextSelection(selection)) {\n cursor = selection.$cursor\n }\n\n if (cursor) {\n const currentMarks = state.storedMarks ?? cursor.marks()\n const parentAllowsMarkType = cursor.parent.type.allowsMarkType(newMarkType)\n\n // There can be no current marks that exclude the new mark, and the parent must allow this mark type\n return (\n parentAllowsMarkType &&\n (!!newMarkType.isInSet(currentMarks) ||\n !currentMarks.some(mark => mark.type.excludes(newMarkType)))\n )\n }\n\n const { ranges } = selection\n\n return ranges.some(({ $from, $to }) => {\n let someNodeSupportsMark =\n $from.depth === 0\n ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)\n : false\n\n state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\n // If we already found a mark that we can enable, return false to bypass the remaining search\n if (someNodeSupportsMark) {\n return false\n }\n\n if (node.isInline) {\n const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)\n const currentMarksAllowMarkType =\n !!newMarkType.isInSet(node.marks) ||\n !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))\n\n someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType\n }\n return !someNodeSupportsMark\n })\n\n return someNodeSupportsMark\n })\n}\nexport const setMark: RawCommands['setMark'] =\n (typeOrName, attributes = {}) =>\n ({ tr, state, dispatch }) => {\n const { selection } = tr\n const { empty, ranges } = selection\n const type = getMarkType(typeOrName, state.schema)\n\n if (dispatch) {\n if (empty) {\n const oldAttributes = getMarkAttributes(state, type)\n\n tr.addStoredMark(\n type.create({\n ...oldAttributes,\n ...attributes,\n }),\n )\n } else {\n ranges.forEach(range => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n const trimmedFrom = Math.max(pos, from)\n const trimmedTo = Math.min(pos + node.nodeSize, to)\n const someHasMark = node.marks.find(mark => mark.type === type)\n\n // if there is already a mark of this type\n // we know that we have to merge its attributes\n // otherwise we add a fresh new mark\n if (someHasMark) {\n node.marks.forEach(mark => {\n if (type === mark.type) {\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n type.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n })\n } else {\n tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))\n }\n })\n })\n }\n }\n\n return canSetMark(state, tr, type)\n }\n","import type { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setMeta: {\n /**\n * Store a metadata property in the current transaction.\n * @param key The key of the metadata property.\n * @param value The value to store.\n * @example editor.commands.setMeta('foo', 'bar')\n */\n setMeta: (key: string | Plugin | PluginKey, value: any) => ReturnType\n }\n }\n}\n\nexport const setMeta: RawCommands['setMeta'] =\n (key, value) =>\n ({ tr }) => {\n tr.setMeta(key, value)\n\n return true\n }\n","import { setBlockType } from '@tiptap/pm/commands'\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setNode: {\n /**\n * Replace a given range with a node.\n * @param typeOrName The type or name of the node\n * @param attributes The attributes of the node\n * @example editor.commands.setNode('paragraph')\n */\n setNode: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const setNode: RawCommands['setNode'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch, chain }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n let attributesToCopy: Record<string, any> | undefined\n\n if (state.selection.$anchor.sameParent(state.selection.$head)) {\n // only copy attributes if the selection is pointing to a node of the same type\n attributesToCopy = state.selection.$anchor.parent.attrs\n }\n\n // TODO: use a fallback like insertContent?\n if (!type.isTextblock) {\n console.warn('[tiptap warn]: Currently \"setNode()\" only supports text block nodes.')\n\n return false\n }\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(({ commands }) => {\n const canSetBlock = setBlockType(type, { ...attributesToCopy, ...attributes })(state)\n\n if (canSetBlock) {\n return true\n }\n\n return commands.clearNodes()\n })\n .command(({ state: updatedState }) => {\n return setBlockType(type, { ...attributesToCopy, ...attributes })(updatedState, dispatch)\n })\n .run()\n )\n }\n","import { NodeSelection } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setNodeSelection: {\n /**\n * Creates a NodeSelection.\n * @param position - Position of the node.\n * @example editor.commands.setNodeSelection(10)\n */\n setNodeSelection: (position: number) => ReturnType\n }\n }\n}\n\nexport const setNodeSelection: RawCommands['setNodeSelection'] =\n position =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const { doc } = tr\n const from = minMax(position, 0, doc.content.size)\n const selection = NodeSelection.create(doc, from)\n\n tr.setSelection(selection)\n }\n\n return true\n }\n","import type { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setTextDirection: {\n /**\n * Set the text direction for nodes.\n * If no position is provided, it will use the current selection.\n * @param direction The text direction to set ('ltr', 'rtl', or 'auto')\n * @param position Optional position or range to apply the direction to\n * @example editor.commands.setTextDirection('rtl')\n * @example editor.commands.setTextDirection('ltr', { from: 0, to: 10 })\n */\n setTextDirection: (direction: 'ltr' | 'rtl' | 'auto', position?: number | Range) => ReturnType\n }\n }\n}\n\nexport const setTextDirection: RawCommands['setTextDirection'] =\n (direction, position) =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n let from: number\n let to: number\n\n if (typeof position === 'number') {\n from = position\n to = position\n } else if (position && 'from' in position && 'to' in position) {\n from = position.from\n to = position.to\n } else {\n from = selection.from\n to = selection.to\n }\n\n if (dispatch) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n dir: direction,\n })\n })\n }\n\n return true\n }\n","import { TextSelection } from '@tiptap/pm/state'\n\nimport type { Range, RawCommands } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setTextSelection: {\n /**\n * Creates a TextSelection.\n * @param position The position of the selection.\n * @example editor.commands.setTextSelection(10)\n */\n setTextSelection: (position: number | Range) => ReturnType\n }\n }\n}\n\nexport const setTextSelection: RawCommands['setTextSelection'] =\n position =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const { doc } = tr\n const { from, to } =\n typeof position === 'number' ? { from: position, to: position } : position\n const minPos = TextSelection.atStart(doc).from\n const maxPos = TextSelection.atEnd(doc).to\n const resolvedFrom = minMax(from, minPos, maxPos)\n const resolvedEnd = minMax(to, minPos, maxPos)\n const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)\n\n tr.setSelection(selection)\n }\n\n return true\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport { sinkListItem as originalSinkListItem } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n sinkListItem: {\n /**\n * Sink the list item down into an inner list.\n * @param typeOrName The type or name of the node.\n * @example editor.commands.sinkListItem('listItem')\n */\n sinkListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const sinkListItem: RawCommands['sinkListItem'] =\n typeOrName =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalSinkListItem(type)(state, dispatch)\n }\n","import type { EditorState } from '@tiptap/pm/state'\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state'\nimport { canSplit } from '@tiptap/pm/transform'\n\nimport { defaultBlockAt } from '../helpers/defaultBlockAt.js'\nimport { getSplittedAttributes } from '../helpers/getSplittedAttributes.js'\nimport type { RawCommands } from '../types.js'\n\nfunction ensureMarks(state: EditorState, splittableMarks?: string[]) {\n const marks =\n state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks())\n\n if (marks) {\n const filteredMarks = marks.filter(mark => splittableMarks?.includes(mark.type.name))\n\n state.tr.ensureMarks(filteredMarks)\n }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n splitBlock: {\n /**\n * Forks a new node from an existing node.\n * @param options.keepMarks Keep marks from the previous node.\n * @example editor.commands.splitBlock()\n * @example editor.commands.splitBlock({ keepMarks: true })\n */\n splitBlock: (options?: { keepMarks?: boolean }) => ReturnType\n }\n }\n}\n\nexport const splitBlock: RawCommands['splitBlock'] =\n ({ keepMarks = true } = {}) =>\n ({ tr, state, dispatch, editor }) => {\n const { selection, doc } = tr\n const { $from, $to } = selection\n const extensionAttributes = editor.extensionManager.attributes\n const newAttributes = getSplittedAttributes(\n extensionAttributes,\n $from.node().type.name,\n $from.node().attrs,\n )\n\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(doc, $from.pos)) {\n return false\n }\n\n if (dispatch) {\n if (keepMarks) {\n ensureMarks(state, editor.extensionManager.splittableMarks)\n }\n\n tr.split($from.pos).scrollIntoView()\n }\n\n return true\n }\n\n if (!$from.parent.isBlock) {\n return false\n }\n\n const atEnd = $to.parentOffset === $to.parent.content.size\n\n const deflt =\n $from.depth === 0\n ? undefined\n : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)))\n\n let types =\n atEnd && deflt\n ? [\n {\n type: deflt,\n attrs: newAttributes,\n },\n ]\n : undefined\n\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types)\n\n if (\n !types &&\n !can &&\n canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)\n ) {\n can = true\n types = deflt\n ? [\n {\n type: deflt,\n attrs: newAttributes,\n },\n ]\n : undefined\n }\n\n if (dispatch) {\n if (can) {\n if (selection instanceof TextSelection) {\n tr.deleteSelection()\n }\n\n tr.split(tr.mapping.map($from.pos), 1, types)\n\n if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\n const first = tr.mapping.map($from.before())\n const $first = tr.doc.resolve(first)\n\n if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt)\n }\n }\n }\n\n if (keepMarks) {\n ensureMarks(state, editor.extensionManager.splittableMarks)\n }\n\n tr.scrollIntoView()\n }\n\n return can\n }\n","import type { Node as ProseMirrorNode, NodeType } from '@tiptap/pm/model'\nimport { Fragment, Slice } from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { canSplit } from '@tiptap/pm/transform'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSplittedAttributes } from '../helpers/getSplittedAttributes.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n splitListItem: {\n /**\n * Splits one list item into two list items.\n * @param typeOrName The type or name of the node.\n * @param overrideAttrs The attributes to ensure on the new node.\n * @example editor.commands.splitListItem('listItem')\n */\n splitListItem: (\n typeOrName: string | NodeType,\n overrideAttrs?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const splitListItem: RawCommands['splitListItem'] =\n (typeOrName, overrideAttrs = {}) =>\n ({ tr, state, dispatch, editor }) => {\n const type = getNodeType(typeOrName, state.schema)\n const { $from, $to } = state.selection\n\n // @ts-ignore\n // oxlint-disable-next-line\n const node: ProseMirrorNode = state.selection.node\n\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\n return false\n }\n\n const grandParent = $from.node(-1)\n\n if (grandParent.type !== type) {\n return false\n }\n\n const extensionAttributes = editor.extensionManager.attributes\n\n if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if (\n $from.depth === 2 ||\n $from.node(-3).type !== type ||\n $from.index(-2) !== $from.node(-2).childCount - 1\n ) {\n return false\n }\n\n if (dispatch) {\n let wrap = Fragment.empty\n // oxlint-disable-next-line\n const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3\n\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {\n wrap = Fragment.from($from.node(d).copy(wrap))\n }\n\n const depthAfter =\n // oxlint-disable-next-line no-nested-ternary\n $from.indexAfter(-1) < $from.node(-2).childCount\n ? 1\n : $from.indexAfter(-2) < $from.node(-3).childCount\n ? 2\n : 3\n\n // Add a second list item with an empty default start node\n const newNextTypeAttributes = {\n ...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),\n ...overrideAttrs,\n }\n const nextType =\n type.contentMatch.defaultType?.createAndFill(newNextTypeAttributes) || undefined\n\n wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined))\n\n const start = $from.before($from.depth - (depthBefore - 1))\n\n tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0))\n\n let sel = -1\n\n tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\n if (sel > -1) {\n return false\n }\n\n if (n.isTextblock && n.content.size === 0) {\n sel = pos + 1\n }\n })\n\n if (sel > -1) {\n tr.setSelection(TextSelection.near(tr.doc.resolve(sel)))\n }\n\n tr.scrollIntoView()\n }\n\n return true\n }\n\n const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null\n\n const newTypeAttributes = {\n ...getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs),\n ...overrideAttrs,\n }\n const newNextTypeAttributes = {\n ...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),\n ...overrideAttrs,\n }\n\n tr.delete($from.pos, $to.pos)\n\n const types = nextType\n ? [\n { type, attrs: newTypeAttributes },\n { type: nextType, attrs: newNextTypeAttributes },\n ]\n : [{ type, attrs: newTypeAttributes }]\n\n if (!canSplit(tr.doc, $from.pos, 2)) {\n return false\n }\n\n if (dispatch) {\n const { selection, storedMarks } = state\n const { splittableMarks } = editor.extensionManager\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n tr.split($from.pos, 2, types).scrollIntoView()\n\n if (!marks || !dispatch) {\n return true\n }\n\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n }\n\n return true\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { canJoin } from '@tiptap/pm/transform'\n\nimport { findParentNode } from '../helpers/findParentNode.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isList } from '../helpers/isList.js'\nimport type { RawCommands } from '../types.js'\n\nconst joinListBackwards = (tr: Transaction, listType: NodeType): boolean => {\n const list = findParentNode(node => node.type === listType)(tr.selection)\n\n if (!list) {\n return true\n }\n\n const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth)\n\n if (before === undefined) {\n return true\n }\n\n const nodeBefore = tr.doc.nodeAt(before)\n const canJoinBackwards = list.node.type === nodeBefore?.type && canJoin(tr.doc, list.pos)\n\n if (!canJoinBackwards) {\n return true\n }\n\n tr.join(list.pos)\n\n return true\n}\n\nconst joinListForwards = (tr: Transaction, listType: NodeType): boolean => {\n const list = findParentNode(node => node.type === listType)(tr.selection)\n\n if (!list) {\n return true\n }\n\n const after = tr.doc.resolve(list.start).after(list.depth)\n\n if (after === undefined) {\n return true\n }\n\n const nodeAfter = tr.doc.nodeAt(after)\n const canJoinForwards = list.node.type === nodeAfter?.type && canJoin(tr.doc, after)\n\n if (!canJoinForwards) {\n return true\n }\n\n tr.join(after)\n\n return true\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleList: {\n /**\n * Toggle between different list types.\n * @param listTypeOrName The type or name of the list.\n * @param itemTypeOrName The type or name of the list item.\n * @param keepMarks Keep marks when toggling.\n * @param attributes Attributes for the new list.\n * @example editor.commands.toggleList('bulletList', 'listItem')\n */\n toggleList: (\n listTypeOrName: string | NodeType,\n itemTypeOrName: string | NodeType,\n keepMarks?: boolean,\n attributes?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nfunction createInnerSelectionForWholeDocList(tr: Transaction) {\n const doc = tr.doc\n const list = doc.firstChild\n\n if (!list) {\n return null\n }\n\n // Place the selection inside the list node so that ProseMirror's\n // liftListItem command can operate. AllSelection sits at the doc root.\n // Use TextSelection.between to resolve positions into valid inline\n // content positions, so the selection survives position mapping after\n // liftListItem removes list/item wrappers.\n const $start = doc.resolve(1)\n const $end = doc.resolve(list.nodeSize - 1)\n\n return TextSelection.between($start, $end)\n}\nexport const toggleList: RawCommands['toggleList'] =\n (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) =>\n ({ editor, tr, state, dispatch, chain, commands, can }) => {\n const { extensions, splittableMarks } = editor.extensionManager\n const listType = getNodeType(listTypeOrName, state.schema)\n const itemType = getNodeType(itemTypeOrName, state.schema)\n const { selection, storedMarks } = state\n const { $from, $to } = selection\n const range = $from.blockRange($to)\n\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n if (!range) {\n return false\n }\n\n const parentList = findParentNode(node => isList(node.type.name, extensions))(selection)\n\n // When the user presses Ctrl/Cmd+A, ProseMirror creates an `AllSelection`\n // covering the entire document (0..doc.content.size). In that case\n // `findParentNode` cannot detect the surrounding list because the\n // selection sits at the document root. If the document consists of a\n // single top-level list node, treat that list as the active list so the\n // toggle logic can correctly lift or change it.\n const isAllSelection = selection.from === 0 && selection.to === state.doc.content.size\n const topLevelNodes = state.doc.content.content\n const soleTopLevelNode = topLevelNodes.length === 1 ? topLevelNodes[0] : null\n const allSelectionList =\n isAllSelection && soleTopLevelNode && isList(soleTopLevelNode.type.name, extensions)\n ? {\n node: soleTopLevelNode,\n pos: 0,\n depth: 0,\n }\n : null\n\n const currentList = parentList ?? allSelectionList\n\n const isInsideExistingList =\n !!parentList && range.depth >= 1 && range.depth - parentList.depth <= 1\n\n const hasWholeDocSelectedList = !!allSelectionList\n if ((isInsideExistingList || hasWholeDocSelectedList) && currentList) {\n // remove list\n if (currentList.node.type === listType) {\n if (isAllSelection && hasWholeDocSelectedList) {\n return chain()\n .command(({ tr: trx, dispatch: disp }) => {\n // Ctrl/Cmd+A creates an AllSelection at the document root.\n // When the whole document is a single top-level list, normalize the\n // selection into that list before lifting, since liftListItem expects\n // a selection inside a list item.\n const nextSelection = createInnerSelectionForWholeDocList(trx)\n\n if (!nextSelection) {\n return false\n }\n\n trx.setSelection(nextSelection)\n\n if (disp) {\n disp(trx)\n }\n\n return true\n })\n .liftListItem(itemType)\n .run()\n }\n\n return commands.liftListItem(itemType)\n }\n\n // change list type\n if (\n isList(currentList.node.type.name, extensions) &&\n listType.validContent(currentList.node.content)\n ) {\n return chain()\n .command(() => {\n tr.setNodeMarkup(currentList.pos, listType)\n\n return true\n })\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n }\n }\n\n if (!keepMarks || !marks || !dispatch) {\n return (\n chain()\n // try to convert node to default node if needed\n .command(() => {\n const canWrapInList = can().wrapInList(listType, attributes)\n if (canWrapInList) {\n return true\n }\n return commands.clearNodes()\n })\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n )\n }\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(() => {\n const canWrapInList = can().wrapInList(listType, attributes)\n\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n\n if (canWrapInList) {\n return true\n }\n return commands.clearNodes()\n })\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n )\n }\n","import type { MarkType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { isMarkActive } from '../helpers/isMarkActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleMark: {\n /**\n * Toggle a mark on and off.\n * @param typeOrName The mark type or name.\n * @param attributes The attributes of the mark.\n * @param options.extendEmptyMarkRange Removes the mark even across the current selection. Defaults to `false`.\n * @example editor.commands.toggleMark('bold')\n */\n toggleMark: (\n /**\n * The mark type or name.\n */\n typeOrName: string | MarkType,\n\n /**\n * The attributes of the mark.\n */\n attributes?: Record<string, any>,\n\n options?: {\n /**\n * Removes the mark even across the current selection. Defaults to `false`.\n */\n extendEmptyMarkRange?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const toggleMark: RawCommands['toggleMark'] =\n (typeOrName, attributes = {}, options = {}) =>\n ({ state, commands }) => {\n const { extendEmptyMarkRange = false } = options\n const type = getMarkType(typeOrName, state.schema)\n const isActive = isMarkActive(state, type, attributes)\n\n if (isActive) {\n return commands.unsetMark(type, { extendEmptyMarkRange })\n }\n\n return commands.setMark(type, attributes)\n }\n","import type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleNode: {\n /**\n * Toggle a node with another node.\n * @param typeOrName The type or name of the node.\n * @param toggleTypeOrName The type or name of the node to toggle.\n * @param attributes The attributes of the node.\n * @example editor.commands.toggleNode('heading', 'paragraph')\n */\n toggleNode: (\n typeOrName: string | NodeType,\n toggleTypeOrName: string | NodeType,\n attributes?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const toggleNode: RawCommands['toggleNode'] =\n (typeOrName, toggleTypeOrName, attributes = {}) =>\n ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema)\n const toggleType = getNodeType(toggleTypeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n let attributesToCopy: Record<string, any> | undefined\n\n if (state.selection.$anchor.sameParent(state.selection.$head)) {\n // only copy attributes if the selection is pointing to a node of the same type\n attributesToCopy = state.selection.$anchor.parent.attrs\n }\n\n if (isActive) {\n return commands.setNode(toggleType, attributesToCopy)\n }\n\n // If the node is not active, we want to set the new node type with the given attributes\n // Copying over the attributes from the current node if the selection is pointing to a node of the same type\n return commands.setNode(type, { ...attributesToCopy, ...attributes })\n }\n","import type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleWrap: {\n /**\n * Wraps nodes in another node, or removes an existing wrap.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.toggleWrap('blockquote')\n */\n toggleWrap: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const toggleWrap: RawCommands['toggleWrap'] =\n (typeOrName, attributes = {}) =>\n ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (isActive) {\n return commands.lift(type)\n }\n\n return commands.wrapIn(type, attributes)\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n undoInputRule: {\n /**\n * Undo an input rule.\n * @example editor.commands.undoInputRule()\n */\n undoInputRule: () => ReturnType\n }\n }\n}\n\nexport const undoInputRule: RawCommands['undoInputRule'] =\n () =>\n ({ state, dispatch }) => {\n const plugins = state.plugins\n\n for (let i = 0; i < plugins.length; i += 1) {\n const plugin = plugins[i]\n let undoable\n\n // @ts-ignore\n // oxlint-disable-next-line\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n const tr = state.tr\n const toUndo = undoable.transform\n\n for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) {\n tr.step(toUndo.steps[j].invert(toUndo.docs[j]))\n }\n\n if (undoable.text) {\n const marks = tr.doc.resolve(undoable.from).marks()\n\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks))\n } else {\n tr.delete(undoable.from, undoable.to)\n }\n }\n\n return true\n }\n }\n\n return false\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unsetAllMarks: {\n /**\n * Remove all clearable marks in the current selection.\n * Marks with `clearable: false` are preserved\n * @param options.ignoreClearable If true, removes all marks regardless of `clearable` setting. Defaults to `false`.\n * @example editor.commands.unsetAllMarks()\n * @example editor.commands.unsetAllMarks({ ignoreClearable: true })\n */\n unsetAllMarks: (options?: { ignoreClearable?: boolean }) => ReturnType\n }\n }\n}\n\nexport const unsetAllMarks: RawCommands['unsetAllMarks'] =\n (options = {}) =>\n ({ tr, dispatch, editor }) => {\n const { ignoreClearable = false } = options\n const { selection } = tr\n const { empty, ranges } = selection\n\n if (empty) {\n return true\n }\n\n const { nonClearableMarks } = editor.extensionManager\n\n if (dispatch) {\n const clearableMarkTypes = Object.values(editor.schema.marks).filter(\n markType => ignoreClearable || !nonClearableMarks.includes(markType.name),\n )\n\n ranges.forEach(range => {\n for (const markType of clearableMarkTypes) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType)\n }\n })\n }\n\n return true\n }\n","import type { MarkType } from '@tiptap/pm/model'\n\nimport { getMarkRange } from '../helpers/getMarkRange.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unsetMark: {\n /**\n * Remove all marks in the current selection.\n * @param typeOrName The mark type or name.\n * @param options.extendEmptyMarkRange Removes the mark even across the current selection. Defaults to `false`.\n * @example editor.commands.unsetMark('bold')\n */\n unsetMark: (\n /**\n * The mark type or name.\n */\n typeOrName: string | MarkType,\n\n options?: {\n /**\n * Removes the mark even across the current selection. Defaults to `false`.\n */\n extendEmptyMarkRange?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const unsetMark: RawCommands['unsetMark'] =\n (typeOrName, options = {}) =>\n ({ tr, state, dispatch }) => {\n const { extendEmptyMarkRange = false } = options\n const { selection } = tr\n const type = getMarkType(typeOrName, state.schema)\n const { $from, empty, ranges } = selection\n\n if (!dispatch) {\n return true\n }\n\n if (empty && extendEmptyMarkRange) {\n let { from, to } = selection\n const attrs = $from.marks().find(mark => mark.type === type)?.attrs\n const range = getMarkRange($from, type, attrs)\n\n if (range) {\n from = range.from\n to = range.to\n }\n\n tr.removeMark(from, to, type)\n } else {\n ranges.forEach(range => {\n tr.removeMark(range.$from.pos, range.$to.pos, type)\n })\n }\n\n tr.removeStoredMark(type)\n\n return true\n }\n","import type { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unsetTextDirection: {\n /**\n * Remove the text direction attribute from nodes.\n * If no position is provided, it will use the current selection.\n * @param position Optional position or range to remove the direction from\n * @example editor.commands.unsetTextDirection()\n * @example editor.commands.unsetTextDirection({ from: 0, to: 10 })\n */\n unsetTextDirection: (position?: number | Range) => ReturnType\n }\n }\n}\n\nexport const unsetTextDirection: RawCommands['unsetTextDirection'] =\n position =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n let from: number\n let to: number\n\n if (typeof position === 'number') {\n from = position\n to = position\n } else if (position && 'from' in position && 'to' in position) {\n from = position.from\n to = position.to\n } else {\n from = selection.from\n to = selection.to\n }\n\n if (dispatch) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n const newAttrs = { ...node.attrs }\n\n delete newAttrs.dir\n\n tr.setNodeMarkup(pos, undefined, newAttrs)\n })\n }\n\n return true\n }\n","import type { Mark, MarkType, Node, NodeType } from '@tiptap/pm/model'\nimport type { SelectionRange } from '@tiptap/pm/state'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n updateAttributes: {\n /**\n * Update attributes of a node or mark.\n * @param typeOrName The type or name of the node or mark.\n * @param attributes The attributes of the node or mark.\n * @example editor.commands.updateAttributes('mention', { userId: \"2\" })\n */\n updateAttributes: (\n /**\n * The type or name of the node or mark.\n */\n typeOrName: string | NodeType | MarkType,\n\n /**\n * The attributes of the node or mark.\n */\n attributes: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const updateAttributes: RawCommands['updateAttributes'] =\n (typeOrName, attributes = {}) =>\n ({ tr, state, dispatch }) => {\n let nodeType: NodeType | null = null\n let markType: MarkType | null = null\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (!schemaType) {\n return false\n }\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName as NodeType, state.schema)\n }\n\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName as MarkType, state.schema)\n }\n\n let canUpdate = false\n\n tr.selection.ranges.forEach((range: SelectionRange) => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n let lastPos: number | undefined\n let lastNode: Node | undefined\n let trimmedFrom: number\n let trimmedTo: number\n\n if (tr.selection.empty) {\n state.doc.nodesBetween(from, to, (node: Node, pos: number) => {\n if (nodeType && nodeType === node.type) {\n canUpdate = true\n trimmedFrom = Math.max(pos, from)\n trimmedTo = Math.min(pos + node.nodeSize, to)\n lastPos = pos\n lastNode = node\n }\n })\n } else {\n state.doc.nodesBetween(from, to, (node: Node, pos: number) => {\n if (pos < from && nodeType && nodeType === node.type) {\n canUpdate = true\n trimmedFrom = Math.max(pos, from)\n trimmedTo = Math.min(pos + node.nodeSize, to)\n lastPos = pos\n lastNode = node\n }\n\n if (pos >= from && pos <= to) {\n if (nodeType && nodeType === node.type) {\n canUpdate = true\n\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n ...attributes,\n })\n }\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach((mark: Mark) => {\n if (markType === mark.type) {\n canUpdate = true\n\n if (dispatch) {\n const trimmedFrom2 = Math.max(pos, from)\n const trimmedTo2 = Math.min(pos + node.nodeSize, to)\n\n tr.addMark(\n trimmedFrom2,\n trimmedTo2,\n markType.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n }\n })\n }\n }\n })\n }\n\n if (lastNode) {\n if (lastPos !== undefined && dispatch) {\n tr.setNodeMarkup(lastPos, undefined, {\n ...lastNode.attrs,\n ...attributes,\n })\n }\n\n if (markType && lastNode.marks.length) {\n lastNode.marks.forEach((mark: Mark) => {\n if (markType === mark.type && dispatch) {\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n markType.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n })\n }\n }\n })\n\n return canUpdate\n }\n","import { wrapIn as originalWrapIn } from '@tiptap/pm/commands'\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n wrapIn: {\n /**\n * Wraps nodes in another node.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.wrapIn('blockquote')\n */\n wrapIn: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const wrapIn: RawCommands['wrapIn'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalWrapIn(type, attributes)(state, dispatch)\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport { wrapInList as originalWrapInList } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n wrapInList: {\n /**\n * Wrap a node in a list.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.wrapInList('bulletList')\n */\n wrapInList: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const wrapInList: RawCommands['wrapInList'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalWrapInList(type, attributes)(state, dispatch)\n }\n","// see: https://github.com/mesqueeb/is-what/blob/88d6e4ca92fb2baab6003c54e02eedf4e729e5ab/src/index.ts\n\nfunction getType(value: any): string {\n return Object.prototype.toString.call(value).slice(8, -1)\n}\n\nexport function isPlainObject(value: any): value is Record<string, any> {\n if (getType(value) !== 'Object') {\n return false\n }\n\n return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype\n}\n","import { isPlainObject } from './isPlainObject.js'\n\nexport function mergeDeep(\n target: Record<string, any>,\n source: Record<string, any>,\n): Record<string, any> {\n const output = { ...target }\n\n if (isPlainObject(target) && isPlainObject(source)) {\n Object.keys(source).forEach(key => {\n if (isPlainObject(source[key]) && isPlainObject(target[key])) {\n output[key] = mergeDeep(target[key], source[key])\n } else {\n output[key] = source[key]\n }\n })\n }\n\n return output\n}\n","import type { Plugin } from '@tiptap/pm/state'\n\nimport type { Editor } from './Editor.js'\nimport { getExtensionField } from './helpers/getExtensionField.js'\nimport type { ExtensionConfig, MarkConfig, NodeConfig } from './index.js'\nimport type { InputRule } from './InputRule.js'\nimport type { Mark } from './Mark.js'\nimport type { Node } from './Node.js'\nimport type { PasteRule } from './PasteRule.js'\nimport type {\n AnyConfig,\n DispatchTransactionProps,\n EditorEvents,\n Extensions,\n GlobalAttributes,\n JSONContent,\n KeyboardShortcutCommand,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownRendererHelpers,\n MarkdownToken,\n MarkdownTokenizer,\n ParentConfig,\n RawCommands,\n RenderContext,\n} from './types.js'\nimport { callOrReturn } from './utilities/callOrReturn.js'\nimport { mergeDeep } from './utilities/mergeDeep.js'\n\nexport interface ExtendableConfig<\n Options = any,\n Storage = any,\n Config extends\n | ExtensionConfig<Options, Storage>\n | NodeConfig<Options, Storage>\n | MarkConfig<Options, Storage>\n | ExtendableConfig<Options, Storage> = ExtendableConfig<Options, Storage, any, any>,\n PMType = any,\n> {\n /**\n * The extension name - this must be unique.\n * It will be used to identify the extension.\n *\n * @example 'myExtension'\n */\n name: string\n\n /**\n * The priority of your extension. The higher, the earlier it will be called\n * and will take precedence over other extensions with a lower priority.\n * @default 100\n * @example 101\n */\n priority?: number\n\n /**\n * This method will add options to this extension\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#settings\n * @example\n * addOptions() {\n * return {\n * myOption: 'foo',\n * myOtherOption: 10,\n * }\n */\n addOptions?: (this: { name: string; parent: ParentConfig<Config>['addOptions'] }) => Options\n\n /**\n * The default storage this extension can save data to.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#storage\n * @example\n * defaultStorage: {\n * prefetchedUsers: [],\n * loading: false,\n * }\n */\n addStorage?: (this: {\n name: string\n options: Options\n parent: ParentConfig<Config>['addStorage']\n }) => Storage\n\n /**\n * This function adds globalAttributes to specific nodes.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#global-attributes\n * @example\n * addGlobalAttributes() {\n * return [\n * {\n // Extend the following extensions\n * types: [\n * 'heading',\n * 'paragraph',\n * ],\n * // … with those attributes\n * attributes: {\n * textAlign: {\n * default: 'left',\n * renderHTML: attributes => ({\n * style: `text-align: ${attributes.textAlign}`,\n * }),\n * parseHTML: element => element.style.textAlign || 'left',\n * },\n * },\n * },\n * ]\n * }\n */\n addGlobalAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n extensions: (Node | Mark)[]\n parent: ParentConfig<Config>['addGlobalAttributes']\n }) => GlobalAttributes\n\n /**\n * This function adds commands to the editor\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#commands\n * @example\n * addCommands() {\n * return {\n * myCommand: () => ({ chain }) => chain().setMark('type', 'foo').run(),\n * }\n * }\n */\n addCommands?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addCommands']\n }) => Partial<RawCommands>\n\n /**\n * This function registers keyboard shortcuts.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#keyboard-shortcuts\n * @example\n * addKeyboardShortcuts() {\n * return {\n * 'Mod-l': () => this.editor.commands.toggleBulletList(),\n * }\n * },\n */\n addKeyboardShortcuts?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addKeyboardShortcuts']\n }) => {\n [key: string]: KeyboardShortcutCommand\n }\n\n /**\n * This function adds input rules to the editor.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#input-rules\n * @example\n * addInputRules() {\n * return [\n * markInputRule({\n * find: inputRegex,\n * type: this.type,\n * }),\n * ]\n * },\n */\n addInputRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addInputRules']\n }) => InputRule[]\n\n /**\n * This function adds paste rules to the editor.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#paste-rules\n * @example\n * addPasteRules() {\n * return [\n * markPasteRule({\n * find: pasteRegex,\n * type: this.type,\n * }),\n * ]\n * },\n */\n addPasteRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addPasteRules']\n }) => PasteRule[]\n\n /**\n * This function adds Prosemirror plugins to the editor\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#prosemirror-plugins\n * @example\n * addProseMirrorPlugins() {\n * return [\n * customPlugin(),\n * ]\n * }\n */\n addProseMirrorPlugins?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addProseMirrorPlugins']\n }) => Plugin[]\n\n /**\n * This function transforms pasted HTML content before it's parsed.\n * Extensions can use this to modify or clean up pasted HTML.\n * The transformations are chained - each extension's transform receives\n * the output from the previous extension's transform.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#transform-pasted-html\n * @example\n * transformPastedHTML(html) {\n * // Remove all style attributes\n * return html.replace(/style=\"[^\"]*\"/g, '')\n * }\n */\n transformPastedHTML?: (\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['transformPastedHTML']\n },\n html: string,\n ) => string\n\n /**\n * This function adds additional extensions to the editor. This is useful for\n * building extension kits.\n * @example\n * addExtensions() {\n * return [\n * BulletList,\n * OrderedList,\n * ListItem\n * ]\n * }\n */\n addExtensions?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<Config>['addExtensions']\n }) => Extensions\n\n /**\n * The markdown token name\n *\n * This is the name of the token that this extension uses to parse and render markdown and comes from the Marked Lexer.\n *\n * @see https://github.com/markedjs/marked/blob/master/src/Tokens.ts\n *\n */\n markdownTokenName?: string\n\n /**\n * The parse function used by the markdown parser to convert markdown tokens to ProseMirror nodes.\n */\n parseMarkdown?: (token: MarkdownToken, helpers: MarkdownParseHelpers) => MarkdownParseResult\n\n /**\n * The serializer function used by the markdown serializer to convert ProseMirror nodes to markdown tokens.\n */\n renderMarkdown?: (\n node: JSONContent,\n helpers: MarkdownRendererHelpers,\n ctx: RenderContext,\n ) => string\n\n /**\n * The markdown tokenizer responsible for turning a markdown string into tokens\n *\n * Custom tokenizers are only needed when you want to parse non-standard markdown token.\n */\n markdownTokenizer?: MarkdownTokenizer\n\n /**\n * Optional markdown options for indentation\n */\n markdownOptions?: {\n /**\n * Defines if this markdown element should indent it's child elements\n */\n indentsContent?: boolean\n\n /**\n * Lets a mark tell the Markdown serializer which inline HTML tags it can\n * safely use when plain markdown delimiters would become ambiguous.\n *\n * This is mainly useful for overlapping marks. For example, bold followed\n * by bold+italic followed by italic cannot always be written back with only\n * `*` and `**` in a way that still parses correctly. In that case, the\n * serializer can close the overlapping section with markdown and reopen the\n * remaining tail with HTML instead.\n *\n * Example:\n * - desired formatting: `**123` + `*456*` + `789 italic`\n * - serialized result: `**123*456***<em>789</em>`\n *\n * If your extension defines custom mark names, set `htmlReopen` on that\n * extension so the serializer can reuse its HTML form for overlap cases.\n */\n htmlReopen?: {\n open: string\n close: string\n }\n }\n\n /**\n * This function extends the schema of the node.\n * @example\n * extendNodeSchema() {\n * return {\n * group: 'inline',\n * selectable: false,\n * }\n * }\n */\n extendNodeSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<Config>['extendNodeSchema']\n },\n extension: Node,\n ) => Record<string, any>)\n | null\n\n /**\n * This function extends the schema of the mark.\n * @example\n * extendMarkSchema() {\n * return {\n * group: 'inline',\n * selectable: false,\n * }\n * }\n */\n extendMarkSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<Config>['extendMarkSchema']\n },\n extension: Mark,\n ) => Record<string, any>)\n | null\n\n /**\n * The editor is not ready yet.\n */\n onBeforeCreate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onBeforeCreate']\n },\n event: EditorEvents['beforeCreate'],\n ) => void)\n | null\n\n /**\n * The editor is ready.\n */\n onCreate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onCreate']\n },\n event: EditorEvents['create'],\n ) => void)\n | null\n\n /**\n * The content has changed.\n */\n onUpdate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onUpdate']\n },\n event: EditorEvents['update'],\n ) => void)\n | null\n\n /**\n * The selection has changed.\n */\n onSelectionUpdate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onSelectionUpdate']\n },\n event: EditorEvents['selectionUpdate'],\n ) => void)\n | null\n\n /**\n * The editor state has changed.\n */\n onTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onTransaction']\n },\n event: EditorEvents['transaction'],\n ) => void)\n | null\n\n /**\n * The editor is focused.\n */\n onFocus?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onFocus']\n },\n event: EditorEvents['focus'],\n ) => void)\n | null\n\n /**\n * The editor isn’t focused anymore.\n */\n onBlur?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onBlur']\n },\n event: EditorEvents['blur'],\n ) => void)\n | null\n\n /**\n * The editor is destroyed.\n */\n onDestroy?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onDestroy']\n },\n event: EditorEvents['destroy'],\n ) => void)\n | null\n\n /**\n * This hook allows you to intercept and modify transactions before they are dispatched.\n *\n * Example\n * ```ts\n * dispatchTransaction({ transaction, next }) {\n * console.log('Dispatching transaction:', transaction)\n * next(transaction)\n * }\n * ```\n *\n * @param props - The dispatch transaction props\n */\n dispatchTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['dispatchTransaction']\n },\n props: DispatchTransactionProps,\n ) => void)\n | null\n}\n\nexport class Extendable<\n Options = any,\n Storage = any,\n Config =\n | ExtensionConfig<Options, Storage>\n | NodeConfig<Options, Storage>\n | MarkConfig<Options, Storage>,\n> {\n type = 'extendable'\n parent: Extendable | null = null\n\n child: Extendable | null = null\n\n name = ''\n\n config: Config = {\n name: this.name,\n } as Config\n\n constructor(config: Partial<Config> = {}) {\n this.config = {\n ...this.config,\n ...config,\n }\n\n this.name = (this.config as any).name\n }\n\n get options(): Options {\n return {\n ...callOrReturn(\n getExtensionField<AnyConfig['addOptions']>(this as any, 'addOptions', {\n name: this.name,\n }),\n ),\n }\n }\n\n get storage(): Readonly<Storage> {\n return {\n ...callOrReturn(\n getExtensionField<AnyConfig['addStorage']>(this as any, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ),\n }\n }\n\n configure(options: Partial<Options> = {}) {\n const extension = this.extend<Options, Storage, Config>({\n ...this.config,\n addOptions: () => {\n return mergeDeep(this.options as Record<string, any>, options) as Options\n },\n })\n\n extension.name = this.name\n extension.parent = this.parent\n\n this.child = null\n\n return extension\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig =\n | ExtensionConfig<ExtendedOptions, ExtendedStorage>\n | NodeConfig<ExtendedOptions, ExtendedStorage>\n | MarkConfig<ExtendedOptions, ExtendedStorage>,\n >(extendedConfig: Partial<ExtendedConfig> = {}): Extendable<ExtendedOptions, ExtendedStorage> {\n const extension = new (this.constructor as any)({ ...this.config, ...extendedConfig })\n\n extension.parent = this\n this.child = extension\n extension.name = 'name' in extendedConfig ? extendedConfig.name : extension.parent.name\n\n return extension\n }\n}\n","import type { DOMOutputSpec, Mark as ProseMirrorMark, MarkSpec, MarkType } from '@tiptap/pm/model'\n\nimport type { Editor } from './Editor.js'\nimport type { ExtendableConfig } from './Extendable.js'\nimport { Extendable } from './Extendable.js'\nimport type { Attributes, MarkViewRenderer, ParentConfig } from './types.js'\n\nexport interface MarkConfig<Options = any, Storage = any> extends ExtendableConfig<\n Options,\n Storage,\n MarkConfig<Options, Storage>,\n MarkType\n> {\n /**\n * Mark View\n */\n addMarkView?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig<MarkConfig<Options, Storage>>['addMarkView']\n }) => MarkViewRenderer)\n | null\n\n /**\n * Keep mark after split node\n */\n keepOnSplit?: boolean | (() => boolean)\n\n /**\n * Whether this mark is removed by `unsetAllMarks`.\n * Set to `false` for semantic marks (comments, suggestions) that should survive \"clear formatting\".\n * @default true\n */\n clearable?: boolean | (() => boolean)\n\n /**\n * Inclusive\n */\n inclusive?:\n | MarkSpec['inclusive']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['inclusive']\n editor?: Editor\n }) => MarkSpec['inclusive'])\n\n /**\n * Excludes\n */\n excludes?:\n | MarkSpec['excludes']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['excludes']\n editor?: Editor\n }) => MarkSpec['excludes'])\n\n /**\n * Marks this Mark as exitable\n */\n exitable?: boolean | (() => boolean)\n\n /**\n * Group\n */\n group?:\n | MarkSpec['group']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['group']\n editor?: Editor\n }) => MarkSpec['group'])\n\n /**\n * Spanning\n */\n spanning?:\n | MarkSpec['spanning']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['spanning']\n editor?: Editor\n }) => MarkSpec['spanning'])\n\n /**\n * Code\n */\n code?:\n | boolean\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['code']\n editor?: Editor\n }) => boolean)\n\n /**\n * Parse HTML\n */\n parseHTML?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['parseHTML']\n editor?: Editor\n }) => MarkSpec['parseDOM']\n\n /**\n * Render HTML\n */\n renderHTML?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['renderHTML']\n editor?: Editor\n },\n props: {\n mark: ProseMirrorMark\n HTMLAttributes: Record<string, any>\n },\n ) => DOMOutputSpec)\n | null\n\n /**\n * Attributes\n */\n addAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['addAttributes']\n editor?: Editor\n // oxlint-disable-next-lineno-empty-object-type\n }) => Attributes | {}\n}\n\n/**\n * The Mark class is used to create custom mark extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nexport class Mark<Options = any, Storage = any> extends Extendable<\n Options,\n Storage,\n MarkConfig<Options, Storage>\n> {\n type = 'mark'\n\n /**\n * Create a new Mark instance\n * @param config - Mark configuration object or a function that returns a configuration object\n */\n static create<O = any, S = any>(\n config: Partial<MarkConfig<O, S>> | (() => Partial<MarkConfig<O, S>>) = {},\n ) {\n // If the config is a function, execute it to get the configuration object\n const resolvedConfig = typeof config === 'function' ? config() : config\n return new Mark<O, S>(resolvedConfig)\n }\n\n static handleExit({ editor, mark }: { editor: Editor; mark: Mark }) {\n const { tr } = editor.state\n const currentPos = editor.state.selection.$from\n const isAtEnd = currentPos.pos === currentPos.end()\n\n if (isAtEnd) {\n const currentMarks = currentPos.marks()\n const isInMark = !!currentMarks.find(m => m?.type.name === mark.name)\n\n if (!isInMark) {\n return false\n }\n\n const removeMark = currentMarks.find(m => m?.type.name === mark.name)\n\n if (removeMark) {\n tr.removeStoredMark(removeMark)\n }\n tr.insertText(' ', currentPos.pos)\n\n editor.view.dispatch(tr)\n\n return true\n }\n\n return false\n }\n\n configure(options?: Partial<Options>) {\n return super.configure(options) as Mark<Options, Storage>\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig extends MarkConfig<ExtendedOptions, ExtendedStorage> = MarkConfig<\n ExtendedOptions,\n ExtendedStorage\n >,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string\n options: ExtendedOptions\n storage: ExtendedStorage\n editor: Editor\n type: MarkType\n }>),\n ): Mark<ExtendedOptions, ExtendedStorage> {\n // If the extended config is a function, execute it to get the configuration object\n const resolvedConfig = typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig\n return super.extend(resolvedConfig) as Mark<ExtendedOptions, ExtendedStorage>\n }\n}\n","export { ClipboardTextSerializer } from './clipboardTextSerializer.js'\nexport { Commands } from './commands.js'\nexport { Delete } from './delete.js'\nexport { Drop } from './drop.js'\nexport { Editable } from './editable.js'\nexport { FocusEvents, focusEventsPluginKey } from './focusEvents.js'\nexport { Keymap } from './keymap.js'\nexport { Paste } from './paste.js'\nexport { Tabindex } from './tabindex.js'\nexport { TextDirection } from './textDirection.js'\n","import type { Editor } from './Editor.js'\nimport { type ExtendableConfig, Extendable } from './Extendable.js'\n\n// oxlint-disable-next-lineno-empty-object-type\nexport interface ExtensionConfig<Options = any, Storage = any> extends ExtendableConfig<\n Options,\n Storage,\n ExtensionConfig<Options, Storage>,\n null\n> {}\n\n/**\n * The Extension class is the base class for all extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nexport class Extension<Options = any, Storage = any> extends Extendable<\n Options,\n Storage,\n ExtensionConfig<Options, Storage>\n> {\n type = 'extension'\n\n /**\n * Create a new Extension instance\n * @param config - Extension configuration object or a function that returns a configuration object\n */\n static create<O = any, S = any>(\n config: Partial<ExtensionConfig<O, S>> | (() => Partial<ExtensionConfig<O, S>>) = {},\n ) {\n // If the config is a function, execute it to get the configuration object\n const resolvedConfig = typeof config === 'function' ? config() : config\n return new Extension<O, S>(resolvedConfig)\n }\n\n configure(options?: Partial<Options>) {\n return super.configure(options) as Extension<Options, Storage>\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig = ExtensionConfig<ExtendedOptions, ExtendedStorage>,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string\n options: ExtendedOptions\n storage: ExtendedStorage\n editor: Editor\n type: null\n }>),\n ): Extension<ExtendedOptions, ExtendedStorage> {\n // If the extended config is a function, execute it to get the configuration object\n const resolvedConfig = typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig\n return super.extend(resolvedConfig) as Extension<ExtendedOptions, ExtendedStorage>\n }\n}\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\nimport { getTextBetween } from '../helpers/getTextBetween.js'\nimport { getTextSerializersFromSchema } from '../helpers/getTextSerializersFromSchema.js'\n\nexport type ClipboardTextSerializerOptions = {\n blockSeparator?: string\n}\n\nexport const ClipboardTextSerializer = Extension.create<ClipboardTextSerializerOptions>({\n name: 'clipboardTextSerializer',\n\n addOptions() {\n return {\n blockSeparator: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('clipboardTextSerializer'),\n props: {\n clipboardTextSerializer: () => {\n const { editor } = this\n const { state, schema } = editor\n const { doc, selection } = state\n const textSerializers = getTextSerializersFromSchema(schema)\n const { blockSeparator } = this.options\n const options = {\n ...(blockSeparator !== undefined ? { blockSeparator } : {}),\n textSerializers,\n }\n\n // Serialize each selection range independently and join the results.\n // CellSelection exposes one range per selected cell; flattening to\n // min(from)/max(to) would pull in unselected cells between them.\n // Sort by document position so reverse selections (e.g. dragging\n // upward) still emit text in document order.\n const sortedRanges = [...selection.ranges].sort((a, b) => a.$from.pos - b.$from.pos)\n\n return sortedRanges\n .map(({ $from, $to }) =>\n getTextBetween(doc, { from: $from.pos, to: $to.pos }, options),\n )\n .join(blockSeparator ?? '\\n\\n')\n },\n },\n }),\n ]\n },\n})\n","import * as commands from '../commands/index.js'\nimport { Extension } from '../Extension.js'\n\nexport * from '../commands/index.js'\n\nexport const Commands = Extension.create({\n name: 'commands',\n\n addCommands() {\n return {\n ...commands,\n }\n },\n})\n","import { RemoveMarkStep } from '@tiptap/pm/transform'\n\nimport { Extension } from '../Extension.js'\nimport { combineTransactionSteps, getChangedRanges } from '../helpers/index.js'\n\n/**\n * This extension allows you to be notified when the user deletes content you are interested in.\n */\nexport const Delete = Extension.create({\n name: 'delete',\n\n onUpdate({ transaction, appendedTransactions }) {\n const callback = () => {\n if (\n this.editor.options.coreExtensionOptions?.delete?.filterTransaction?.(transaction) ??\n transaction.getMeta('y-sync$')\n ) {\n return\n }\n const nextTransaction = combineTransactionSteps(transaction.before, [\n transaction,\n ...appendedTransactions,\n ])\n const changes = getChangedRanges(nextTransaction)\n\n changes.forEach(change => {\n if (\n nextTransaction.mapping.mapResult(change.oldRange.from).deletedAfter &&\n nextTransaction.mapping.mapResult(change.oldRange.to).deletedBefore\n ) {\n nextTransaction.before.nodesBetween(\n change.oldRange.from,\n change.oldRange.to,\n (node, from) => {\n const to = from + node.nodeSize - 2\n const isFullyWithinRange = change.oldRange.from <= from && to <= change.oldRange.to\n\n this.editor.emit('delete', {\n type: 'node',\n node,\n from,\n to,\n newFrom: nextTransaction.mapping.map(from),\n newTo: nextTransaction.mapping.map(to),\n deletedRange: change.oldRange,\n newRange: change.newRange,\n partial: !isFullyWithinRange,\n editor: this.editor,\n transaction,\n combinedTransform: nextTransaction,\n })\n },\n )\n }\n })\n\n const mapping = nextTransaction.mapping\n nextTransaction.steps.forEach((step, index) => {\n if (step instanceof RemoveMarkStep) {\n const newStart = mapping.slice(index).map(step.from, -1)\n const newEnd = mapping.slice(index).map(step.to)\n const oldStart = mapping.invert().map(newStart, -1)\n const oldEnd = mapping.invert().map(newEnd)\n\n const foundBeforeMark =\n newStart > 0\n ? nextTransaction.doc.nodeAt(newStart - 1)?.marks.some(mark => mark.eq(step.mark))\n : false\n const foundAfterMark = nextTransaction.doc\n .nodeAt(newEnd)\n ?.marks.some(mark => mark.eq(step.mark))\n\n this.editor.emit('delete', {\n type: 'mark',\n mark: step.mark,\n from: step.from,\n to: step.to,\n deletedRange: {\n from: oldStart,\n to: oldEnd,\n },\n newRange: {\n from: newStart,\n to: newEnd,\n },\n partial: Boolean(foundAfterMark || foundBeforeMark),\n editor: this.editor,\n transaction,\n combinedTransform: nextTransaction,\n })\n }\n })\n }\n\n if (this.editor.options.coreExtensionOptions?.delete?.async ?? true) {\n setTimeout(callback, 0)\n } else {\n callback()\n }\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Drop = Extension.create({\n name: 'drop',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tiptapDrop'),\n\n props: {\n handleDrop: (_, e, slice, moved) => {\n this.editor.emit('drop', {\n editor: this.editor,\n event: e,\n slice,\n moved,\n })\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Editable = Extension.create({\n name: 'editable',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: () => this.editor.options.editable,\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const focusEventsPluginKey = new PluginKey('focusEvents')\n\nexport const FocusEvents = Extension.create({\n name: 'focusEvents',\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n new Plugin({\n key: focusEventsPluginKey,\n props: {\n handleDOMEvents: {\n focus: (view, event: Event) => {\n editor.isFocused = true\n\n const transaction = editor.state.tr\n .setMeta('focus', { event })\n .setMeta('addToHistory', false)\n\n view.dispatch(transaction)\n\n return false\n },\n blur: (view, event: Event) => {\n editor.isFocused = false\n\n const transaction = editor.state.tr\n .setMeta('blur', { event })\n .setMeta('addToHistory', false)\n\n view.dispatch(transaction)\n\n return false\n },\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey, Selection } from '@tiptap/pm/state'\n\nimport { CommandManager } from '../CommandManager.js'\nimport { Extension } from '../Extension.js'\nimport { createChainableState } from '../helpers/createChainableState.js'\nimport { isNodeEmpty } from '../helpers/isNodeEmpty.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isMacOS } from '../utilities/isMacOS.js'\n\nexport const Keymap = Extension.create({\n name: 'keymap',\n\n addKeyboardShortcuts() {\n const handleBackspace = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.undoInputRule(),\n\n // maybe convert first text block node to default node\n () =>\n commands.command(({ tr }) => {\n const { selection, doc } = tr\n const { empty, $anchor } = selection\n const { pos, parent } = $anchor\n const $parentPos =\n $anchor.parent.isTextblock && pos > 0 ? tr.doc.resolve(pos - 1) : $anchor\n const parentIsIsolating = $parentPos.parent.type.spec.isolating\n\n const parentPos = $anchor.pos - $anchor.parentOffset\n\n const isAtStart =\n parentIsIsolating && $parentPos.parent.childCount === 1\n ? parentPos === $anchor.pos\n : Selection.atStart(doc).from === pos\n\n if (\n !empty ||\n !parent.type.isTextblock ||\n parent.textContent.length ||\n !isAtStart ||\n (isAtStart && $anchor.parent.type.name === 'paragraph') // prevent clearNodes when no nodes to clear, otherwise history stack is appended\n ) {\n return false\n }\n\n return commands.clearNodes()\n }),\n\n () => commands.deleteSelection(),\n () => commands.joinBackward(),\n () => commands.selectNodeBackward(),\n ])\n\n const handleDelete = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.deleteSelection(),\n () => commands.deleteCurrentNode(),\n () => commands.joinForward(),\n () => commands.selectNodeForward(),\n ])\n\n const handleEnter = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ])\n\n const baseKeymap = {\n Enter: handleEnter,\n 'Mod-Enter': () => this.editor.commands.exitCode(),\n Backspace: handleBackspace,\n 'Mod-Backspace': handleBackspace,\n 'Shift-Backspace': handleBackspace,\n Delete: handleDelete,\n 'Mod-Delete': handleDelete,\n 'Mod-a': () => this.editor.commands.selectAll(),\n }\n\n const pcKeymap = {\n ...baseKeymap,\n }\n\n const macKeymap = {\n ...baseKeymap,\n 'Ctrl-h': handleBackspace,\n 'Alt-Backspace': handleBackspace,\n 'Ctrl-d': handleDelete,\n 'Ctrl-Alt-Backspace': handleDelete,\n 'Alt-Delete': handleDelete,\n 'Alt-d': handleDelete,\n 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),\n 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),\n }\n\n if (isiOS() || isMacOS()) {\n return macKeymap\n }\n\n return pcKeymap\n },\n\n addProseMirrorPlugins() {\n return [\n // With this plugin we check if the whole document was selected and deleted.\n // In this case we will additionally call `clearNodes()` to convert e.g. a heading\n // to a paragraph if necessary.\n // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well\n // with many other commands.\n new Plugin({\n key: new PluginKey('clearDocument'),\n appendTransaction: (transactions, oldState, newState) => {\n if (transactions.some(tr => tr.getMeta('composition'))) {\n return\n }\n\n const docChanges =\n transactions.some(transaction => transaction.docChanged) &&\n !oldState.doc.eq(newState.doc)\n\n const ignoreTr = transactions.some(transaction =>\n transaction.getMeta('preventClearDocument'),\n )\n\n if (!docChanges || ignoreTr) {\n return\n }\n\n const { empty, from, to } = oldState.selection\n const allFrom = Selection.atStart(oldState.doc).from\n const allEnd = Selection.atEnd(oldState.doc).to\n const allWasSelected = from === allFrom && to === allEnd\n\n if (empty || !allWasSelected) {\n return\n }\n\n const isEmpty = isNodeEmpty(newState.doc)\n\n if (!isEmpty) {\n return\n }\n\n const tr = newState.tr\n const state = createChainableState({\n state: newState,\n transaction: tr,\n })\n const { commands } = new CommandManager({\n editor: this.editor,\n state,\n })\n\n commands.clearNodes()\n\n if (!tr.steps.length) {\n return\n }\n\n return tr\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Paste = Extension.create({\n name: 'paste',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tiptapPaste'),\n\n props: {\n handlePaste: (_view, e, slice) => {\n this.editor.emit('paste', {\n editor: this.editor,\n event: e,\n slice,\n })\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\n/**\n * Options for the Tabindex extension.\n */\nexport type TabindexOptions = {\n /**\n * The value for the `tabindex` attribute on the editor element.\n * When undefined, editable editors default to `0` and non-editable editors get no tabindex.\n */\n value?: string\n}\n\n/**\n * The Tabindex extension adds a configurable tabindex attribute to the editor.\n *\n * By default, the editor gets tabindex=\"0\" when editable. This can be customized\n * via coreExtensionOptions to support specific focus ordering requirements in forms\n * or to enable focusing on non-editable editors.\n *\n * @example\n * ```ts\n * new Editor({\n * coreExtensionOptions: {\n * tabindex: {\n * value: '-1',\n * },\n * },\n * })\n * ```\n */\nexport const Tabindex = Extension.create<TabindexOptions>({\n name: 'tabindex',\n\n addOptions() {\n return {\n value: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tabindex'),\n props: {\n attributes: (): { [name: string]: string } => {\n if (!this.editor.isEditable && this.options.value === undefined) {\n return {}\n }\n return { tabindex: this.options.value ?? '0' }\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\nimport { splitExtensions } from '../helpers/splitExtensions.js'\n\nexport interface TextDirectionOptions {\n direction: 'ltr' | 'rtl' | 'auto' | undefined\n}\n\n/**\n * The TextDirection extension adds support for setting text direction (LTR/RTL/auto)\n * on all nodes in the editor.\n *\n * This extension adds a global `dir` attribute to all node types, which can be used\n * to control bidirectional text rendering. The direction can be set globally via\n * editor options or per-node using commands.\n */\nexport const TextDirection = Extension.create<TextDirectionOptions>({\n name: 'textDirection',\n\n addOptions() {\n return {\n direction: undefined,\n }\n },\n\n addGlobalAttributes() {\n // Only add the dir attribute to nodes if text direction is configured\n // This prevents null/undefined values from appearing in JSON exports\n if (!this.options.direction) {\n return []\n }\n\n const { nodeExtensions } = splitExtensions(this.extensions)\n\n return [\n {\n types: nodeExtensions\n .filter(extension => extension.name !== 'text')\n .map(extension => extension.name),\n attributes: {\n dir: {\n default: this.options.direction,\n parseHTML: element => {\n const dir = element.getAttribute('dir')\n\n if (dir && (dir === 'ltr' || dir === 'rtl' || dir === 'auto')) {\n return dir\n }\n\n return this.options.direction\n },\n renderHTML: attributes => {\n if (!attributes.dir) {\n return {}\n }\n\n return {\n dir: attributes.dir,\n }\n },\n },\n },\n },\n ]\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('textDirection'),\n props: {\n attributes: (): { [name: string]: string } => {\n const direction = this.options.direction\n\n if (!direction) {\n return {}\n }\n\n return {\n dir: direction,\n }\n },\n },\n }),\n ]\n },\n})\n","/**\n * @fileoverview Markdown utilities for creating standardized markdown specs.\n *\n * This module provides utilities for creating complete markdown specifications\n * for different types of nodes using unified syntax patterns.\n */\n\nexport * from './attributeUtils.js'\nexport * from './createAtomBlockMarkdownSpec.js'\nexport * from './createBlockMarkdownSpec.js'\nexport * from './createInlineMarkdownSpec.js'\nexport * from './parseIndentedBlocks.js'\nexport * from './renderNestedMarkdownContent.js'\n","/**\n * @fileoverview Utility functions for parsing and serializing markdown attributes.\n *\n * These utilities handle the common patterns for parsing attribute strings\n * in various markdown syntaxes like Pandoc attributes.\n */\n\n/**\n * Parses a Pandoc-style attribute string into an object.\n *\n * Supports the following patterns:\n * - Classes: `.className` → `{ class: 'className' }`\n * - IDs: `#myId` → `{ id: 'myId' }`\n * - Key-value pairs: `key=\"value\"` → `{ key: 'value' }`\n * - Boolean attributes: `disabled` → `{ disabled: true }`\n *\n * @param attrString - The attribute string to parse\n * @returns Parsed attributes object\n *\n * @example\n * ```ts\n * parseAttributes('.btn #submit disabled type=\"button\"')\n * // → { class: 'btn', id: 'submit', disabled: true, type: 'button' }\n * ```\n */\nexport function parseAttributes(attrString: string): Record<string, any> {\n if (!attrString?.trim()) {\n return {}\n }\n\n const attributes: Record<string, any> = {}\n\n // First, extract and remove quoted strings to avoid parsing content inside them\n const quotedStrings: string[] = []\n const tempString = attrString.replace(/[\"']([^\"']*)[\"']/g, match => {\n quotedStrings.push(match)\n return `__QUOTED_${quotedStrings.length - 1}__`\n })\n\n // Parse classes (.className) - only outside of quoted strings\n const classMatches = tempString.match(/(?:^|\\s)\\.([a-zA-Z][\\w-]*)/g)\n if (classMatches) {\n const classes = classMatches.map(match => match.trim().slice(1)) // Remove the dot\n attributes.class = classes.join(' ')\n }\n\n // Parse IDs (#myId) - only outside of quoted strings\n const idMatch = tempString.match(/(?:^|\\s)#([a-zA-Z][\\w-]*)/)\n if (idMatch) {\n attributes.id = idMatch[1]\n }\n\n // Parse key-value pairs (key=\"value\" or key='value') - restore quoted strings\n const kvRegex = /([a-zA-Z][\\w-]*)\\s*=\\s*(__QUOTED_\\d+__)/g\n const kvMatches = Array.from(tempString.matchAll(kvRegex))\n kvMatches.forEach(([, key, quotedRef]) => {\n const quotedIndex = parseInt(quotedRef.match(/__QUOTED_(\\d+)__/)?.[1] || '0', 10)\n const quotedValue = quotedStrings[quotedIndex]\n if (quotedValue) {\n // Remove the outer quotes\n attributes[key] = quotedValue.slice(1, -1)\n }\n })\n\n // Parse boolean attributes (standalone words that aren't classes/IDs)\n const cleanString = tempString\n .replace(/(?:^|\\s)\\.([a-zA-Z][\\w-]*)/g, '') // Remove classes\n .replace(/(?:^|\\s)#([a-zA-Z][\\w-]*)/g, '') // Remove IDs\n .replace(/([a-zA-Z][\\w-]*)\\s*=\\s*__QUOTED_\\d+__/g, '') // Remove key-value pairs\n .trim()\n\n if (cleanString) {\n const booleanAttrs = cleanString.split(/\\s+/).filter(Boolean)\n booleanAttrs.forEach(attr => {\n if (attr.match(/^[a-zA-Z][\\w-]*$/)) {\n attributes[attr] = true\n }\n })\n }\n\n return attributes\n}\n\n/**\n * Serializes an attributes object back to a Pandoc-style attribute string.\n *\n * @param attributes - The attributes object to serialize\n * @returns Serialized attribute string\n *\n * @example\n * ```ts\n * serializeAttributes({ class: 'btn primary', id: 'submit', disabled: true, type: 'button' })\n * // → '.btn.primary #submit disabled type=\"button\"'\n * ```\n */\nexport function serializeAttributes(attributes: Record<string, any>): string {\n if (!attributes || Object.keys(attributes).length === 0) {\n return ''\n }\n\n const parts: string[] = []\n\n // Handle classes\n if (attributes.class) {\n const classes = String(attributes.class).split(/\\s+/).filter(Boolean)\n classes.forEach(cls => parts.push(`.${cls}`))\n }\n\n // Handle ID\n if (attributes.id) {\n parts.push(`#${attributes.id}`)\n }\n\n // Handle other attributes\n Object.entries(attributes).forEach(([key, value]) => {\n if (key === 'class' || key === 'id') {\n return // Already handled\n }\n\n if (value === true) {\n // Boolean attribute\n parts.push(key)\n } else if (value !== false && value != null) {\n // Key-value attribute\n parts.push(`${key}=\"${String(value)}\"`)\n }\n })\n\n return parts.join(' ')\n}\n","import type {\n JSONContent,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownToken,\n MarkdownTokenizer,\n} from '../../types.js'\nimport {\n parseAttributes as defaultParseAttributes,\n serializeAttributes as defaultSerializeAttributes,\n} from './attributeUtils.js'\n\nexport interface AtomBlockMarkdownSpecOptions {\n /** The Tiptap node name this spec is for */\n nodeName: string\n /** The markdown syntax name (defaults to nodeName if not provided) */\n name?: string\n /** Function to parse attributes from token attribute string */\n parseAttributes?: (attrString: string) => Record<string, any>\n /** Function to serialize attributes back to string for rendering */\n serializeAttributes?: (attrs: Record<string, any>) => string\n /** Default attributes to apply when parsing */\n defaultAttributes?: Record<string, any>\n /** Required attributes that must be present for successful parsing */\n requiredAttributes?: string[]\n /** Attributes that are allowed to be rendered back to markdown (whitelist) */\n allowedAttributes?: string[]\n}\n\n/**\n * Creates a complete markdown spec for atomic block nodes using Pandoc syntax.\n *\n * The generated spec handles:\n * - Parsing self-closing blocks with `:::blockName {attributes}`\n * - Extracting and parsing attributes\n * - Validating required attributes\n * - Rendering blocks back to markdown\n *\n * @param options - Configuration for the atomic block markdown spec\n * @returns Complete markdown specification object\n *\n * @example\n * ```ts\n * const youtubeSpec = createAtomBlockMarkdownSpec({\n * nodeName: 'youtube',\n * requiredAttributes: ['src'],\n * defaultAttributes: { start: 0 },\n * allowedAttributes: ['src', 'start', 'width', 'height'] // Only these get rendered to markdown\n * })\n *\n * // Usage in extension:\n * export const Youtube = Node.create({\n * // ... other config\n * markdown: youtubeSpec\n * })\n * ```\n */\nexport function createAtomBlockMarkdownSpec(options: AtomBlockMarkdownSpecOptions): {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => MarkdownParseResult\n markdownTokenizer: MarkdownTokenizer\n renderMarkdown: (node: JSONContent) => string\n} {\n const {\n nodeName,\n name: markdownName,\n parseAttributes = defaultParseAttributes,\n serializeAttributes = defaultSerializeAttributes,\n defaultAttributes = {},\n requiredAttributes = [],\n allowedAttributes,\n } = options\n\n // Use markdownName for syntax, fallback to nodeName\n const blockName = markdownName || nodeName\n\n // Helper function to filter attributes based on allowlist\n const filterAttributes = (attrs: Record<string, any>) => {\n if (!allowedAttributes) {\n return attrs\n }\n\n const filtered: Record<string, any> = {}\n allowedAttributes.forEach(key => {\n if (key in attrs) {\n filtered[key] = attrs[key]\n }\n })\n return filtered\n }\n\n return {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => {\n const attrs = { ...defaultAttributes, ...token.attributes }\n return h.createNode(nodeName, attrs, [])\n },\n\n markdownTokenizer: {\n name: nodeName,\n level: 'block' as const,\n start(src: string) {\n const regex = new RegExp(`^:::${blockName}(?:\\\\s|$)`, 'm')\n const index = src.match(regex)?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, _tokens, _lexer) {\n // Use non-global regex to match from the start of the string\n // Include optional newline to ensure we consume the entire line\n const regex = new RegExp(`^:::${blockName}(?:\\\\s+\\\\{([^}]*)\\\\})?\\\\s*:::(?:\\\\n|$)`)\n const match = src.match(regex)\n\n if (!match) {\n return undefined\n }\n\n // Parse attributes if present\n const attrString = match[1] || ''\n const attributes = parseAttributes(attrString)\n\n // Validate required attributes\n const missingRequired = requiredAttributes.find(required => !(required in attributes))\n if (missingRequired) {\n return undefined\n }\n\n return {\n type: nodeName,\n raw: match[0],\n attributes,\n }\n },\n },\n\n renderMarkdown: node => {\n const filteredAttrs = filterAttributes(node.attrs || {})\n const attrs = serializeAttributes(filteredAttrs)\n const attrString = attrs ? ` {${attrs}}` : ''\n\n return `:::${blockName}${attrString} :::`\n },\n }\n}\n","import type {\n JSONContent,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownRendererHelpers,\n MarkdownToken,\n MarkdownTokenizer,\n} from '../../types.js'\nimport {\n parseAttributes as defaultParseAttributes,\n serializeAttributes as defaultSerializeAttributes,\n} from './attributeUtils.js'\n\nexport interface BlockMarkdownSpecOptions {\n /** The Tiptap node name this spec is for */\n nodeName: string\n /** The markdown syntax name (defaults to nodeName if not provided) */\n name?: string\n /** Function to extract content from the node for serialization */\n getContent?: (token: MarkdownToken) => string\n /** Function to parse attributes from the attribute string */\n parseAttributes?: (attrString: string) => Record<string, any>\n /** Function to serialize attributes to string */\n serializeAttributes?: (attrs: Record<string, any>) => string\n /** Default attributes to apply when parsing */\n defaultAttributes?: Record<string, any>\n /** Content type: 'block' allows paragraphs/lists/etc, 'inline' only allows bold/italic/links/etc */\n content?: 'block' | 'inline'\n /** Allowlist of attributes to include in markdown (if not provided, all attributes are included) */\n allowedAttributes?: string[]\n}\n\n/**\n * Creates a complete markdown spec for block-level nodes using Pandoc syntax.\n *\n * The generated spec handles:\n * - Parsing blocks with `:::blockName {attributes}` syntax\n * - Extracting and parsing attributes\n * - Rendering blocks back to markdown with proper formatting\n * - Nested content support\n *\n * @param options - Configuration for the block markdown spec\n * @returns Complete markdown specification object\n *\n * @example\n * ```ts\n * const calloutSpec = createBlockMarkdownSpec({\n * nodeName: 'callout',\n * defaultAttributes: { type: 'info' },\n * allowedAttributes: ['type', 'title'] // Only these get rendered to markdown\n * })\n *\n * // Usage in extension:\n * export const Callout = Node.create({\n * // ... other config\n * markdown: calloutSpec\n * })\n * ```\n */\nexport function createBlockMarkdownSpec(options: BlockMarkdownSpecOptions): {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => MarkdownParseResult\n markdownTokenizer: MarkdownTokenizer\n renderMarkdown: (node: JSONContent, h: MarkdownRendererHelpers) => string\n} {\n const {\n nodeName,\n name: markdownName,\n getContent,\n parseAttributes = defaultParseAttributes,\n serializeAttributes = defaultSerializeAttributes,\n defaultAttributes = {},\n content = 'block',\n allowedAttributes,\n } = options\n\n // Use markdownName for syntax, fallback to nodeName\n const blockName = markdownName || nodeName\n\n // Helper function to filter attributes based on allowlist\n const filterAttributes = (attrs: Record<string, any>) => {\n if (!allowedAttributes) {\n return attrs\n }\n\n const filtered: Record<string, any> = {}\n allowedAttributes.forEach(key => {\n if (key in attrs) {\n filtered[key] = attrs[key]\n }\n })\n return filtered\n }\n\n return {\n parseMarkdown: (token, h) => {\n let nodeContent: JSONContent[]\n\n if (getContent) {\n const contentResult = getContent(token)\n // If getContent returns a string, wrap it in a text node\n nodeContent =\n typeof contentResult === 'string'\n ? [{ type: 'text', text: contentResult }]\n : contentResult\n } else if (content === 'block') {\n nodeContent = h.parseChildren(token.tokens || [])\n } else {\n nodeContent = h.parseInline(token.tokens || [])\n }\n\n const attrs = { ...defaultAttributes, ...token.attributes }\n\n return h.createNode(nodeName, attrs, nodeContent)\n },\n\n markdownTokenizer: {\n name: nodeName,\n level: 'block' as const,\n start(src) {\n const regex = new RegExp(`^:::${blockName}`, 'm')\n const index = src.match(regex)?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, _tokens, lexer) {\n // Match the opening tag with optional attributes\n const openingRegex = new RegExp(`^:::${blockName}(?:\\\\s+\\\\{([^}]*)\\\\})?\\\\s*\\\\n`)\n const openingMatch = src.match(openingRegex)\n\n if (!openingMatch) {\n return undefined\n }\n\n const [openingTag, attrString = ''] = openingMatch\n const attributes = parseAttributes(attrString)\n\n // Find the matching closing tag by tracking nesting level\n let level = 1\n const position = openingTag.length\n let matchedContent = ''\n\n // Pattern to match any block opening (:::word) or closing (:::)\n const blockPattern = /^:::([\\w-]*)(\\s.*)?/gm\n const remaining = src.slice(position)\n\n blockPattern.lastIndex = 0\n\n // run until no more matches are found\n for (;;) {\n const match = blockPattern.exec(remaining)\n if (match === null) {\n break\n }\n const matchPos = match.index\n const blockType = match[1] // Empty string for closing tag, block name for opening\n\n if (match[2]?.endsWith(':::')) {\n // this is an atom ::: node, we skip it\n continue\n }\n\n if (blockType) {\n // Opening tag found - increase level\n level += 1\n } else {\n // Closing tag found - decrease level\n level -= 1\n\n if (level === 0) {\n // Found our matching closing tag\n // Don't trim yet - keep newlines for tokenizer regex matching\n const rawContent = remaining.slice(0, matchPos)\n matchedContent = rawContent.trim()\n const fullMatch = src.slice(0, position + matchPos + match[0].length)\n\n // Tokenize the content\n let contentTokens: MarkdownToken[] = []\n if (matchedContent) {\n if (content === 'block') {\n // Use rawContent for tokenization to preserve line boundaries for regex matching\n contentTokens = lexer.blockTokens(rawContent)\n\n // Parse inline tokens for any token that has text content but no tokens\n contentTokens.forEach(token => {\n if (token.text && (!token.tokens || token.tokens.length === 0)) {\n token.tokens = lexer.inlineTokens(token.text)\n }\n })\n\n // Clean up empty trailing paragraphs\n while (contentTokens.length > 0) {\n const lastToken = contentTokens[contentTokens.length - 1]\n if (\n lastToken.type === 'paragraph' &&\n (!lastToken.text || lastToken.text.trim() === '')\n ) {\n contentTokens.pop()\n } else {\n break\n }\n }\n } else {\n contentTokens = lexer.inlineTokens(matchedContent)\n }\n }\n\n return {\n type: nodeName,\n raw: fullMatch,\n attributes,\n content: matchedContent,\n tokens: contentTokens,\n }\n }\n }\n }\n\n // No matching closing tag found\n return undefined\n },\n },\n\n renderMarkdown: (node, h) => {\n const filteredAttrs = filterAttributes(node.attrs || {})\n const attrs = serializeAttributes(filteredAttrs)\n const attrString = attrs ? ` {${attrs}}` : ''\n const renderedContent = h.renderChildren(node.content || [], '\\n\\n')\n\n return `:::${blockName}${attrString}\\n\\n${renderedContent}\\n\\n:::`\n },\n }\n}\n","import type {\n JSONContent,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownToken,\n MarkdownTokenizer,\n} from '../../types.js'\n\n/**\n * Parse shortcode attributes like 'id=\"madonna\" handle=\"john\" name=\"John Doe\"'\n * Requires all values to be quoted with either single or double quotes\n */\nfunction parseShortcodeAttributes(attrString: string): Record<string, any> {\n if (!attrString.trim()) {\n return {}\n }\n\n const attributes: Record<string, any> = {}\n // Match key=value pairs, only accepting quoted values\n const regex = /(\\w+)=(?:\"([^\"]*)\"|'([^']*)')/g\n let match = regex.exec(attrString)\n\n while (match !== null) {\n const [, key, doubleQuoted, singleQuoted] = match\n attributes[key] = doubleQuoted || singleQuoted\n match = regex.exec(attrString)\n }\n\n return attributes\n}\n\n/**\n * Serialize attributes back to shortcode format\n * Always quotes all values with double quotes\n */\nfunction serializeShortcodeAttributes(attrs: Record<string, any>): string {\n return Object.entries(attrs)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ')\n}\n\n/**\n * Configuration for an allowed attribute in markdown serialization.\n * Can be a simple string (attribute name) or an object with additional options.\n */\nexport type AllowedAttribute =\n | string\n | {\n /** The attribute name */\n name: string\n /**\n * If provided, the attribute will be skipped during serialization when its value\n * equals this default value. This keeps markdown output clean by omitting\n * attributes that have their default values.\n */\n skipIfDefault?: any\n }\n\nexport interface InlineMarkdownSpecOptions {\n /** The Tiptap node name this spec is for */\n nodeName: string\n /** The shortcode name (defaults to nodeName if not provided) */\n name?: string\n /** Function to extract content from the node for serialization */\n getContent?: (node: any) => string\n /** Function to parse attributes from the attribute string */\n parseAttributes?: (attrString: string) => Record<string, any>\n /** Function to serialize attributes to string */\n serializeAttributes?: (attrs: Record<string, any>) => string\n /** Default attributes to apply when parsing */\n defaultAttributes?: Record<string, any>\n /** Whether this is a self-closing shortcode (no content, like [emoji name=party]) */\n selfClosing?: boolean\n /**\n * Allowlist of attributes to include in markdown serialization.\n * If not provided, all attributes are included.\n *\n * Each item can be either:\n * - A string: the attribute name (always included if present)\n * - An object: `{ name: string, skipIfDefault?: any }` for conditional inclusion\n *\n * @example\n * // Simple string attributes (backward compatible)\n * allowedAttributes: ['id', 'label']\n *\n * // Mixed with conditional attributes\n * allowedAttributes: [\n * 'id',\n * 'label',\n * { name: 'mentionSuggestionChar', skipIfDefault: '@' }\n * ]\n */\n allowedAttributes?: AllowedAttribute[]\n}\n\n/**\n * Creates a complete markdown spec for inline nodes using attribute syntax.\n *\n * The generated spec handles:\n * - Parsing shortcode syntax with `[nodeName attributes]content[/nodeName]` format\n * - Self-closing shortcodes like `[emoji name=party_popper]`\n * - Extracting and parsing attributes from the opening tag\n * - Rendering inline elements back to shortcode markdown\n * - Supporting both content-based and self-closing inline elements\n *\n * @param options - Configuration for the inline markdown spec\n * @returns Complete markdown specification object\n *\n * @example\n * ```ts\n * // Self-closing mention: [mention id=\"madonna\" label=\"Madonna\"]\n * const mentionSpec = createInlineMarkdownSpec({\n * nodeName: 'mention',\n * selfClosing: true,\n * defaultAttributes: { type: 'user' },\n * allowedAttributes: ['id', 'label'] // Only these get rendered to markdown\n * })\n *\n * // Self-closing emoji: [emoji name=\"party_popper\"]\n * const emojiSpec = createInlineMarkdownSpec({\n * nodeName: 'emoji',\n * selfClosing: true,\n * allowedAttributes: ['name']\n * })\n *\n * // With content: [highlight color=\"yellow\"]text[/highlight]\n * const highlightSpec = createInlineMarkdownSpec({\n * nodeName: 'highlight',\n * selfClosing: false,\n * allowedAttributes: ['color', 'style']\n * })\n *\n * // Usage in extension:\n * export const Mention = Node.create({\n * name: 'mention', // Must match nodeName\n * // ... other config\n * markdown: mentionSpec\n * })\n * ```\n */\nexport function createInlineMarkdownSpec(options: InlineMarkdownSpecOptions): {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => MarkdownParseResult\n markdownTokenizer: MarkdownTokenizer\n renderMarkdown: (node: JSONContent) => string\n} {\n const {\n nodeName,\n name: shortcodeName,\n getContent,\n parseAttributes = parseShortcodeAttributes,\n serializeAttributes = serializeShortcodeAttributes,\n defaultAttributes = {},\n selfClosing = false,\n allowedAttributes,\n } = options\n\n // Use shortcodeName for markdown syntax, fallback to nodeName\n const shortcode = shortcodeName || nodeName\n\n // Helper function to filter attributes based on allowlist\n const filterAttributes = (attrs: Record<string, any>) => {\n if (!allowedAttributes) {\n return attrs\n }\n\n const filtered: Record<string, any> = {}\n allowedAttributes.forEach(attr => {\n // Handle both string and object formats for backward compatibility\n const attrName = typeof attr === 'string' ? attr : attr.name\n const skipIfDefault = typeof attr === 'string' ? undefined : attr.skipIfDefault\n\n if (attrName in attrs) {\n const value = attrs[attrName]\n\n // Skip if value equals the default (when skipIfDefault is specified)\n if (skipIfDefault !== undefined && value === skipIfDefault) {\n return\n }\n\n filtered[attrName] = value\n }\n })\n return filtered\n }\n\n // Escape special regex characters in shortcode name\n const escapedShortcode = shortcode.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n return {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => {\n const attrs = { ...defaultAttributes, ...token.attributes }\n\n if (selfClosing) {\n // Self-closing nodes like mentions are atomic - no content\n return h.createNode(nodeName, attrs)\n }\n\n // Nodes with content\n const content = getContent ? getContent(token) : token.content || ''\n if (content) {\n // For inline content, create text nodes using the proper helper\n return h.createNode(nodeName, attrs, [h.createTextNode(content)])\n }\n return h.createNode(nodeName, attrs, [])\n },\n\n markdownTokenizer: {\n name: nodeName,\n level: 'inline' as const,\n start(src: string) {\n // Create a non-global version for finding the start position\n const startPattern = selfClosing\n ? new RegExp(`\\\\[${escapedShortcode}\\\\s*[^\\\\]]*\\\\]`)\n : new RegExp(`\\\\[${escapedShortcode}\\\\s*[^\\\\]]*\\\\][\\\\s\\\\S]*?\\\\[\\\\/${escapedShortcode}\\\\]`)\n\n const match = src.match(startPattern)\n const index = match?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, _tokens, _lexer) {\n // Use non-global regex to match from the start of the string\n const tokenPattern = selfClosing\n ? new RegExp(`^\\\\[${escapedShortcode}\\\\s*([^\\\\]]*)\\\\]`)\n : new RegExp(\n `^\\\\[${escapedShortcode}\\\\s*([^\\\\]]*)\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/${escapedShortcode}\\\\]`,\n )\n\n const match = src.match(tokenPattern)\n\n if (!match) {\n return undefined\n }\n\n let content = ''\n let attrString = ''\n\n if (selfClosing) {\n // Self-closing: [shortcode attr=\"value\"]\n const [, attrs] = match\n attrString = attrs\n } else {\n // With content: [shortcode attr=\"value\"]content[/shortcode]\n const [, attrs, contentMatch] = match\n attrString = attrs\n content = contentMatch || ''\n }\n\n // Parse attributes from the attribute string\n const attributes = parseAttributes(attrString.trim())\n\n return {\n type: nodeName,\n raw: match[0],\n content: content.trim(),\n attributes,\n }\n },\n },\n\n renderMarkdown: (node: JSONContent) => {\n let content = ''\n if (getContent) {\n content = getContent(node)\n } else if (node.content && node.content.length > 0) {\n // Extract text from content array for inline nodes\n content = node.content\n .filter((child: any) => child.type === 'text')\n .map((child: any) => child.text)\n .join('')\n }\n\n const filteredAttrs = filterAttributes(node.attrs || {})\n const attrs = serializeAttributes(filteredAttrs)\n const attrString = attrs ? ` ${attrs}` : ''\n\n if (selfClosing) {\n return `[${shortcode}${attrString}]`\n }\n\n return `[${shortcode}${attrString}]${content}[/${shortcode}]`\n },\n }\n}\n","/**\n * @fileoverview Utility for parsing indented markdown blocks with hierarchical nesting.\n *\n * This utility handles the complex logic of parsing markdown blocks that can contain\n * nested content based on indentation levels, maintaining proper hierarchical structure\n * for lists, task lists, and other indented block types.\n */\n\nexport interface ParsedBlock {\n type: string\n raw: string\n mainContent: string\n indentLevel: number\n nestedContent?: string\n nestedTokens?: any[]\n [key: string]: any\n}\n\nexport interface BlockParserConfig {\n /** Regex pattern to match block items */\n itemPattern: RegExp\n /** Function to extract data from regex match */\n extractItemData: (match: RegExpMatchArray) => {\n mainContent: string\n indentLevel: number\n [key: string]: any\n }\n /** Function to create the final token */\n createToken: (data: any, nestedTokens?: any[]) => ParsedBlock\n /** Base indentation to remove from nested content (default: 2 spaces) */\n baseIndentSize?: number\n /**\n * Custom parser for nested content. If provided, this will be called instead\n * of the default lexer.blockTokens() for parsing nested content.\n * This allows recursive parsing of the same block type.\n */\n customNestedParser?: (dedentedContent: string) => any[] | undefined\n}\n\n/**\n * Parses markdown text into hierarchical indented blocks with proper nesting.\n *\n * This utility handles:\n * - Line-by-line parsing with pattern matching\n * - Hierarchical nesting based on indentation levels\n * - Nested content collection and parsing\n * - Empty line handling\n * - Content dedenting for nested blocks\n *\n * The key difference from flat parsing is that this maintains the hierarchical\n * structure where nested items become `nestedTokens` of their parent items,\n * rather than being flattened into a single array.\n *\n * @param src - The markdown source text to parse\n * @param config - Configuration object defining how to parse and create tokens\n * @param lexer - Markdown lexer for parsing nested content\n * @returns Parsed result with hierarchical items, or undefined if no matches\n *\n * @example\n * ```ts\n * const result = parseIndentedBlocks(src, {\n * itemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n * extractItemData: (match) => ({\n * indentLevel: match[1].length,\n * mainContent: match[4],\n * checked: match[3].toLowerCase() === 'x'\n * }),\n * createToken: (data, nestedTokens) => ({\n * type: 'taskItem',\n * checked: data.checked,\n * text: data.mainContent,\n * nestedTokens\n * })\n * }, lexer)\n * ```\n */\nexport function parseIndentedBlocks(\n src: string,\n config: BlockParserConfig,\n lexer: {\n inlineTokens: (src: string) => any[]\n blockTokens: (src: string) => any[]\n },\n):\n | {\n items: ParsedBlock[]\n raw: string\n }\n | undefined {\n const lines = src.split('\\n')\n const items: ParsedBlock[] = []\n let totalRaw = ''\n let i = 0\n const baseIndentSize = config.baseIndentSize || 2\n\n while (i < lines.length) {\n const currentLine = lines[i]\n const itemMatch = currentLine.match(config.itemPattern)\n\n if (!itemMatch) {\n // Not a matching item - stop if we have items, otherwise this isn't our block type\n if (items.length > 0) {\n break\n } else if (currentLine.trim() === '') {\n i += 1\n totalRaw = `${totalRaw}${currentLine}\\n`\n continue\n } else {\n return undefined\n }\n }\n\n const itemData = config.extractItemData(itemMatch)\n const { indentLevel, mainContent } = itemData\n totalRaw = `${totalRaw}${currentLine}\\n`\n\n // Collect content for this item (including nested items)\n const itemContent = [mainContent] // Start with the main text\n i += 1\n\n // Look ahead for nested content (indented more than current item)\n while (i < lines.length) {\n const nextLine = lines[i]\n\n if (nextLine.trim() === '') {\n // Empty line - might be end of nested content\n const nextNonEmptyIndex = lines.slice(i + 1).findIndex(l => l.trim() !== '')\n if (nextNonEmptyIndex === -1) {\n // No more content\n break\n }\n\n const nextNonEmpty = lines[i + 1 + nextNonEmptyIndex]\n const nextIndent = nextNonEmpty.match(/^(\\s*)/)?.[1]?.length || 0\n\n if (nextIndent > indentLevel) {\n // Nested content continues after empty line\n itemContent.push(nextLine)\n totalRaw = `${totalRaw}${nextLine}\\n`\n i += 1\n continue\n } else {\n // End of nested content\n break\n }\n }\n\n const nextIndent = nextLine.match(/^(\\s*)/)?.[1]?.length || 0\n\n if (nextIndent > indentLevel) {\n // This is nested content for the current item\n itemContent.push(nextLine)\n totalRaw = `${totalRaw}${nextLine}\\n`\n i += 1\n } else {\n // Same or less indentation - this belongs to parent level\n break\n }\n }\n\n // Parse nested content if present\n let nestedTokens: any[] | undefined\n const nestedContent = itemContent.slice(1)\n\n if (nestedContent.length > 0) {\n // Remove the base indentation from nested content\n const dedentedNested = nestedContent\n .map(nestedLine => nestedLine.slice(indentLevel + baseIndentSize)) // Remove base indent + 2 spaces\n .join('\\n')\n\n if (dedentedNested.trim()) {\n // Use custom nested parser if provided, otherwise fall back to default\n if (config.customNestedParser) {\n nestedTokens = config.customNestedParser(dedentedNested)\n } else {\n nestedTokens = lexer.blockTokens(dedentedNested)\n }\n }\n }\n\n // Create the token using the provided factory function\n const token = config.createToken(itemData, nestedTokens)\n items.push(token)\n }\n\n if (items.length === 0) {\n return undefined\n }\n\n return {\n items,\n raw: totalRaw,\n }\n}\n","import type { JSONContent } from '@tiptap/core'\n\n/**\n * @fileoverview Utility functions for rendering nested content in markdown.\n *\n * This module provides reusable utilities for extensions that need to render\n * content with a prefix on the main line and properly indented nested content.\n */\n\n/**\n * Utility function for rendering content with a main line prefix and nested indented content.\n *\n * This function handles the common pattern of rendering content with:\n * 1. A main line with a prefix (like \"- \" for lists, \"> \" for blockquotes, etc.)\n * 2. Nested content that gets indented properly\n *\n * @param node - The ProseMirror node representing the content\n * @param h - The markdown renderer helper\n * @param prefixOrGenerator - Either a string prefix or a function that generates the prefix from context\n * @param ctx - Optional context object (used when prefixOrGenerator is a function)\n * @returns The rendered markdown string\n *\n * @example\n * ```ts\n * // For a bullet list item with static prefix\n * return renderNestedMarkdownContent(node, h, '- ')\n *\n * // For a task item with static prefix\n * const prefix = `- [${node.attrs?.checked ? 'x' : ' '}] `\n * return renderNestedMarkdownContent(node, h, prefix)\n *\n * // For a blockquote with static prefix\n * return renderNestedMarkdownContent(node, h, '> ')\n *\n * // For content with dynamic prefix based on context\n * return renderNestedMarkdownContent(node, h, ctx => {\n * if (ctx.parentType === 'orderedList') {\n * return `${ctx.index + 1}. `\n * }\n * return '- '\n * }, ctx)\n *\n * // Custom extension example\n * const CustomContainer = Node.create({\n * name: 'customContainer',\n * // ... other config\n * markdown: {\n * render: (node, h) => {\n * const type = node.attrs?.type || 'info'\n * return renderNestedMarkdownContent(node, h, `[${type}] `)\n * }\n * }\n * })\n * ```\n */\nexport function renderNestedMarkdownContent(\n node: JSONContent,\n h: {\n renderChildren: (nodes: JSONContent[]) => string\n renderChild?: (node: JSONContent, index: number) => string\n indent: (text: string) => string\n },\n prefixOrGenerator: string | ((ctx: any) => string),\n ctx?: any,\n): string {\n if (!node || !Array.isArray(node.content)) {\n return ''\n }\n\n // Determine the prefix based on the input\n const prefix =\n typeof prefixOrGenerator === 'function' ? prefixOrGenerator(ctx) : prefixOrGenerator\n\n const [content, ...children] = node.content\n\n // Render the main content (typically a paragraph)\n const mainContent = h.renderChildren([content])\n let output = `${prefix}${mainContent}`\n\n // Handle nested children with proper indentation\n if (children && children.length > 0) {\n children.forEach((child, index) => {\n const childContent = h.renderChild?.(child, index + 1) ?? h.renderChildren([child])\n if (childContent !== undefined && childContent !== null) {\n // Split the child content by lines and indent each line\n const indentedChild = childContent\n .split('\\n')\n .map(line => (line ? h.indent(line) : h.indent('')))\n .join('\\n')\n\n output += child.type === 'paragraph' ? `\\n\\n${indentedChild}` : `\\n${indentedChild}`\n }\n })\n }\n\n return output\n}\n","import type { DOMOutputSpec, Node as ProseMirrorNode, NodeSpec, NodeType } from '@tiptap/pm/model'\n\nimport type { Editor } from './Editor.js'\nimport type { ExtendableConfig } from './Extendable.js'\nimport { Extendable } from './Extendable.js'\nimport type { Attributes, NodeViewRenderer, ParentConfig } from './types.js'\n\nexport interface NodeConfig<Options = any, Storage = any> extends ExtendableConfig<\n Options,\n Storage,\n NodeConfig<Options, Storage>,\n NodeType\n> {\n /**\n * Node View\n */\n addNodeView?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig<NodeConfig<Options, Storage>>['addNodeView']\n }) => NodeViewRenderer | null)\n | null\n\n /**\n * Defines if this node should be a top level node (doc)\n * @default false\n * @example true\n */\n topNode?: boolean\n\n /**\n * The content expression for this node, as described in the [schema\n * guide](/docs/guide/#schema.content_expressions). When not given,\n * the node does not allow any content.\n *\n * You can read more about it on the Prosemirror documentation here\n * @see https://prosemirror.net/docs/guide/#schema.content_expressions\n * @default undefined\n * @example content: 'block+'\n * @example content: 'headline paragraph block*'\n */\n content?:\n | NodeSpec['content']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['content']\n editor?: Editor\n }) => NodeSpec['content'])\n\n /**\n * The marks that are allowed inside of this node. May be a\n * space-separated string referring to mark names or groups, `\"_\"`\n * to explicitly allow all marks, or `\"\"` to disallow marks. When\n * not given, nodes with inline content default to allowing all\n * marks, other nodes default to not allowing marks.\n *\n * @example marks: 'strong em'\n */\n marks?:\n | NodeSpec['marks']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['marks']\n editor?: Editor\n }) => NodeSpec['marks'])\n\n /**\n * The group or space-separated groups to which this node belongs,\n * which can be referred to in the content expressions for the\n * schema.\n *\n * By default Tiptap uses the groups 'block' and 'inline' for nodes. You\n * can also use custom groups if you want to group specific nodes together\n * and handle them in your schema.\n * @example group: 'block'\n * @example group: 'inline'\n * @example group: 'customBlock' // this uses a custom group\n */\n group?:\n | NodeSpec['group']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['group']\n editor?: Editor\n }) => NodeSpec['group'])\n\n /**\n * Should be set to true for inline nodes. (Implied for text nodes.)\n */\n inline?:\n | NodeSpec['inline']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['inline']\n editor?: Editor\n }) => NodeSpec['inline'])\n\n /**\n * Can be set to true to indicate that, though this isn't a [leaf\n * node](https://prosemirror.net/docs/ref/#model.NodeType.isLeaf), it doesn't have directly editable\n * content and should be treated as a single unit in the view.\n *\n * @example atom: true\n */\n atom?:\n | NodeSpec['atom']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['atom']\n editor?: Editor\n }) => NodeSpec['atom'])\n\n /**\n * Controls whether nodes of this type can be selected as a [node\n * selection](https://prosemirror.net/docs/ref/#state.NodeSelection). Defaults to true for non-text\n * nodes.\n *\n * @default true\n * @example selectable: false\n */\n selectable?:\n | NodeSpec['selectable']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['selectable']\n editor?: Editor\n }) => NodeSpec['selectable'])\n\n /**\n * Determines whether nodes of this type can be dragged without\n * being selected. Defaults to false.\n *\n * @default: false\n * @example: draggable: true\n */\n draggable?:\n | NodeSpec['draggable']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['draggable']\n editor?: Editor\n }) => NodeSpec['draggable'])\n\n /**\n * Can be used to indicate that this node contains code, which\n * causes some commands to behave differently.\n */\n code?:\n | NodeSpec['code']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['code']\n editor?: Editor\n }) => NodeSpec['code'])\n\n /**\n * Controls way whitespace in this a node is parsed. The default is\n * `\"normal\"`, which causes the [DOM parser](https://prosemirror.net/docs/ref/#model.DOMParser) to\n * collapse whitespace in normal mode, and normalize it (replacing\n * newlines and such with spaces) otherwise. `\"pre\"` causes the\n * parser to preserve spaces inside the node. When this option isn't\n * given, but [`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) is true, `whitespace`\n * will default to `\"pre\"`. Note that this option doesn't influence\n * the way the node is rendered—that should be handled by `toDOM`\n * and/or styling.\n */\n whitespace?:\n | NodeSpec['whitespace']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['whitespace']\n editor?: Editor\n }) => NodeSpec['whitespace'])\n\n /**\n * Allows a **single** node to be set as linebreak equivalent (e.g. hardBreak).\n * When converting between block types that have whitespace set to \"pre\"\n * and don't support the linebreak node (e.g. codeBlock) and other block types\n * that do support the linebreak node (e.g. paragraphs) - this node will be used\n * as the linebreak instead of stripping the newline.\n *\n * See [linebreakReplacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement).\n */\n linebreakReplacement?:\n | NodeSpec['linebreakReplacement']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['linebreakReplacement']\n editor?: Editor\n }) => NodeSpec['linebreakReplacement'])\n\n /**\n * When enabled, enables both\n * [`definingAsContext`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext) and\n * [`definingForContent`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n *\n * @default false\n * @example isolating: true\n */\n defining?:\n | NodeSpec['defining']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['defining']\n editor?: Editor\n }) => NodeSpec['defining'])\n\n /**\n * When enabled (default is false), the sides of nodes of this type\n * count as boundaries that regular editing operations, like\n * backspacing or lifting, won't cross. An example of a node that\n * should probably have this enabled is a table cell.\n */\n isolating?:\n | NodeSpec['isolating']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['isolating']\n editor?: Editor\n }) => NodeSpec['isolating'])\n\n /**\n * Associates DOM parser information with this node, which can be\n * used by [`DOMParser.fromSchema`](https://prosemirror.net/docs/ref/#model.DOMParser^fromSchema) to\n * automatically derive a parser. The `node` field in the rules is\n * implied (the name of this node will be filled in automatically).\n * If you supply your own parser, you do not need to also specify\n * parsing rules in your schema.\n *\n * @example parseHTML: [{ tag: 'div', attrs: { 'data-id': 'my-block' } }]\n */\n parseHTML?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['parseHTML']\n editor?: Editor\n }) => NodeSpec['parseDOM']\n\n /**\n * A description of a DOM structure. Can be either a string, which is\n * interpreted as a text node, a DOM node, which is interpreted as\n * itself, a `{dom, contentDOM}` object, or an array.\n *\n * An array describes a DOM element. The first value in the array\n * should be a string—the name of the DOM element, optionally prefixed\n * by a namespace URL and a space. If the second element is plain\n * object, it is interpreted as a set of attributes for the element.\n * Any elements after that (including the 2nd if it's not an attribute\n * object) are interpreted as children of the DOM elements, and must\n * either be valid `DOMOutputSpec` values, or the number zero.\n *\n * The number zero (pronounced “hole”) is used to indicate the place\n * where a node's child nodes should be inserted. If it occurs in an\n * output spec, it should be the only child element in its parent\n * node.\n *\n * @example toDOM: ['div[data-id=\"my-block\"]', { class: 'my-block' }, 0]\n */\n renderHTML?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['renderHTML']\n editor?: Editor\n },\n props: {\n node: ProseMirrorNode\n HTMLAttributes: Record<string, any>\n },\n ) => DOMOutputSpec)\n | null\n\n /**\n * renders the node as text\n * @example renderText: () => 'foo\n */\n renderText?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['renderText']\n editor?: Editor\n },\n props: {\n node: ProseMirrorNode\n pos: number\n parent: ProseMirrorNode\n index: number\n },\n ) => string)\n | null\n\n /**\n * Add attributes to the node\n * @example addAttributes: () => ({ class: 'foo' })\n */\n addAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['addAttributes']\n editor?: Editor\n // oxlint-disable-next-lineno-empty-object-type\n }) => Attributes | {}\n}\n\n/**\n * The Node class is used to create custom node extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nexport class Node<Options = any, Storage = any> extends Extendable<\n Options,\n Storage,\n NodeConfig<Options, Storage>\n> {\n type = 'node'\n\n /**\n * Create a new Node instance\n * @param config - Node configuration object or a function that returns a configuration object\n */\n static create<O = any, S = any>(\n config: Partial<NodeConfig<O, S>> | (() => Partial<NodeConfig<O, S>>) = {},\n ) {\n // If the config is a function, execute it to get the configuration object\n const resolvedConfig = typeof config === 'function' ? config() : config\n return new Node<O, S>(resolvedConfig)\n }\n\n configure(options?: Partial<Options>) {\n return super.configure(options) as Node<Options, Storage>\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig extends NodeConfig<ExtendedOptions, ExtendedStorage> = NodeConfig<\n ExtendedOptions,\n ExtendedStorage\n >,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string\n options: ExtendedOptions\n storage: ExtendedStorage\n editor: Editor\n type: NodeType\n }>),\n ): Node<ExtendedOptions, ExtendedStorage> {\n // If the extended config is a function, execute it to get the configuration object\n const resolvedConfig = typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig\n return super.extend(resolvedConfig) as Node<ExtendedOptions, ExtendedStorage>\n }\n}\n","import { Mark } from \"@tiptap/core\";\n\nexport const Highlight = Mark.create({\n name: \"highlight\",\n\n renderHTML({ HTMLAttributes }) {\n return [\"mark\", { style: \"background: #fef08a; border-radius: 2px; padding: 0 2px;\", ...HTMLAttributes }, 0];\n },\n\n parseHTML() {\n return [{ tag: \"mark\" }];\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-Shift-h\": () => this.editor.commands.toggleMark(this.name),\n };\n },\n});\n","import React from \"react\";\nimport { useCurrentEditor } from \"@tiptap/react\";\nimport styles from \"../RichTextEditor.module.scss\";\n\nconst HighlightIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1\" y=\"8\" width=\"12\" height=\"3\" rx=\"1\" fill=\"#fef08a\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path d=\"M4 8L5.5 3h3L10 8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <line x1=\"4.5\" y1=\"6\" x2=\"9.5\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n);\n\nexport const HighlightButton: React.FC = () => {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n const active = editor.isActive(\"highlight\");\n\n return (\n <button\n type=\"button\"\n title=\"Highlight (Mod+Shift+H)\"\n aria-label=\"Highlight\"\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n e.preventDefault();\n editor.chain().focus().toggleMark(\"highlight\").run();\n }}\n >\n <HighlightIcon />\n </button>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\n\nexport const PageBreak = Node.create({\n name: \"pageBreak\",\n group: \"block\",\n atom: true,\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"page-break\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes(HTMLAttributes, { \"data-type\": \"page-break\" })];\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-Enter\": () => this.editor.commands.insertContent({ type: this.name }),\n };\n },\n});\n","import React from \"react\";\nimport { useCurrentEditor } from \"@tiptap/react\";\nimport styles from \"../RichTextEditor.module.scss\";\n\nconst PageBreakIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"1\" width=\"10\" height=\"6\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"3\" y=\"9\" width=\"10\" height=\"6\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"1\" y1=\"8\" x2=\"5\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeDasharray=\"1.5 1.5\" />\n <line x1=\"7\" y1=\"8\" x2=\"9\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeDasharray=\"1.5 1.5\" />\n <line x1=\"11\" y1=\"8\" x2=\"15\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeDasharray=\"1.5 1.5\" />\n </svg>\n);\n\nexport const PageBreakButton: React.FC = () => {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n return (\n <button\n type=\"button\"\n title=\"Page break (Mod+Enter)\"\n aria-label=\"Insert page break\"\n className={styles.toolbarButton}\n onMouseDown={(e) => {\n e.preventDefault();\n editor.chain().focus().insertContent({ type: \"pageBreak\" }).run();\n }}\n >\n <PageBreakIcon />\n </button>\n );\n};\n",".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 transition: width 0.25s ease;\n}\n\n.recentsEmpty {\n background: transparent;\n box-shadow: none;\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.chipWrapRemoving {\n animation: chipOut 0.22s cubic-bezier(0.4, 0, 1, 1) both;\n pointer-events: none;\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@keyframes chipOut {\n 0% {\n transform: scale(1) rotate(0);\n opacity: 1;\n }\n 100% {\n transform: scale(0) rotate(18deg);\n opacity: 0;\n }\n}\n.picker {\n position: relative;\n margin-top: 96px;\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% - 170px));\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbG9yV2hlZWwubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUNBO0VBMUJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBb0JBO0VBQ0U7SUFsQkY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FBa0JBO0VBekNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBa0NBO0VBL0JBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBMEJBO0VBcENBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBNkJBO0VBcERBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBZ0JGO0VBOEJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0lBQ0U7SUFDQTs7O0FBS0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBSUE7OztBQU1GO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQU9GO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7OztBQU1KO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOztBQUVGO0VBQ0U7O0FBRUY7RUFDRTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7SUFBSztJQUFvQzs7RUFDekM7SUFBTztJQUErQjs7O0FBR3hDO0VBQ0U7SUFBSztJQUErQjs7RUFDcEM7SUFBTztJQUFtQzs7O0FBVzVDO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7QUFFRjtFQUNFOzs7QUFLSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7OztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUlBO0VBSUE7OztBQUVGO0VBQ0U7OztBQUVGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBY0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsV0F0QlE7OztBQXlCVjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsV0FwQ1E7OztBQXVDVjtFQUNFO0VBQ0E7OztBQVNGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUVGO0VBQ0U7OztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLGtCQUNFO0VBRUY7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUtGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBR0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7OztBQVFKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBRUY7RUFDRTtFQUNBOzs7QUFHSjtFQUNFOztBQUNBO0VBQ0U7O0FBRUY7RUFDRTs7O0FBR0o7RUFDRTs7QUFDQTtFQUNFOzs7QUFHSjtFQUNFO0lBQUs7O0VBQ0w7SUFBTTs7RUFDTjtJQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlbWUgdG9rZW5zIGFyZSBzY29wZWQgdG8gLnJvb3QgKGNvbXBvbmVudC1sb2NhbCksIG5vdCA6cm9vdCAtLSB0aGlzXG4vLyBjb21wb25lbnQgbXVzdCBiZSBzYWZlIHRvIGRyb3AgaW50byBhbiBhcHAgd2l0aCBpdHMgb3duIGdsb2JhbCB0aGVtZVxuLy8gd2l0aG91dCBjb2xsaWRpbmcuIEFsbCAqY29tcHV0ZWQqIGNvbG9ycyAodGhlIGNvbG9yIHlvdSdyZSBwaWNraW5nLCBiYWRnZVxuLy8gdGludHMsIGdyYWRpZW50cykgYXJlIHBhc3NlZCBpbiBhcyBpbmxpbmUgc3R5bGVzIGZyb20gQ29sb3JXaGVlbC50c3gsIG5vdFxuLy8gQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzIGhlcmUgLS0gb25seSBzdHJ1Y3R1cmFsL3RoZW1lIHRva2VucyBsaXZlIGluIFNDU1MuXG5cbi8vIGxpZ2h0L2RhcmsgcGFsZXR0ZXMgLS0gaWRlbnRpY2FsIHZhbHVlcyBzaGFyZWQgYnkgZXZlcnkgdHJpZ2dlciBiZWxvdyAoT1Ncbi8vIHByZWZlcmVuY2UsIGhvc3QgYXBwJ3MgYW1iaWVudCB0aGVtZSwgYW5kIHRoaXMgaW5zdGFuY2UncyBvd24gYHRoZW1lYCBwcm9wKVxuQG1peGluIGxpZ2h0LXBhbGV0dGUge1xuICAtLWJnOiAjRUNFQUUzO1xuICAtLXN1cmZhY2U6ICNGRkZGRkY7XG4gIC0tc3VyZmFjZS0yOiAjRTNFMEQ4O1xuICAtLWJvcmRlcjogI0QyQ0RDMDtcbiAgLS10ZXh0OiAjMUExOTEzO1xuICAtLXRleHQtZGltOiAjNzI2RjY0O1xuICAtLXRleHQtZmFpbnQ6ICNBOEEzOTg7XG4gIC0tc2hhZG93LXNvZnQ6IDAgMXB4IDJweCByZ2JhKDMwLCAyNSwgMTUsIDAuMDgpO1xuICAtLWNoZWNrLWE6ICNkOGQ0Yzg7XG4gIC0tY2hlY2stYjogI2Y0ZjJlYztcbiAgY29sb3Itc2NoZW1lOiBsaWdodDtcbn1cbkBtaXhpbiBkYXJrLXBhbGV0dGUge1xuICAtLWJnOiAjMTMxMjE3O1xuICAtLXN1cmZhY2U6ICMxQzFCMjI7XG4gIC0tc3VyZmFjZS0yOiAjMjYyNTJFO1xuICAtLWJvcmRlcjogIzM0MzMzRDtcbiAgLS10ZXh0OiAjRUNFQUYwO1xuICAtLXRleHQtZGltOiAjOEU4Qzk5O1xuICAtLXRleHQtZmFpbnQ6ICM2MDVFNkI7XG4gIC0tc2hhZG93LXNvZnQ6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMzUpO1xuICAtLWNoZWNrLWE6ICMzNzM1M2Y7XG4gIC0tY2hlY2stYjogIzIwMWYyNjtcbiAgY29sb3Itc2NoZW1lOiBkYXJrO1xufVxuXG4ucm9vdCB7XG4gIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG5cbiAgLy8gdGhlbWU9XCJzeXN0ZW1cIiAobm8gZGF0YS10aGVtZSBvZiBpdHMgb3duKTogZmFsbCBiYWNrIHRvIHRoZSBPUyBwcmVmZXJlbmNlXG4gIEBtZWRpYSAocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIHtcbiAgICAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0aGVtZT1cInN5c3RlbVwiOiB0aGUgaG9zdCBhcHAncyBhbWJpZW50IHRoZW1lIChkYXRhLXRoZW1lIHNldCBvbiBhblxuICAvLyBhbmNlc3RvciwgZS5nLiA8aHRtbD4gLS0gdGhlIHNhbWUgY29udmVudGlvbiBDb2xvclBpY2tlci9UaW1lbGluZSByZWFkXG4gIC8vIGZyb20pIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYmFyZSBPUyBwcmVmZXJlbmNlIGFib3ZlIHdoZW4gdGhlIGFwcFxuICAvLyBkZWNsYXJlcyBvbmUgLS0gaW5jbHVkaW5nIGV4cGxpY2l0bHkgb3ZlcnJpZGluZyBpdCBiYWNrIHRvIGxpZ2h0LCBzaW5jZVxuICAvLyB0aGUgT1MtcHJlZmVyZW5jZSBydWxlIGFib3ZlIGhhcyBubyB3YXkgdG8ga25vdyB0aGUgYXBwIGRpc2FncmVlc1xuICA6Z2xvYmFsKFtkYXRhLXRoZW1lPSdsaWdodCddKSAmOm5vdChbZGF0YS10aGVtZT0nbGlnaHQnXSk6bm90KFtkYXRhLXRoZW1lPSdkYXJrJ10pIHtcbiAgICBAaW5jbHVkZSBsaWdodC1wYWxldHRlO1xuICB9XG4gIDpnbG9iYWwoW2RhdGEtdGhlbWU9J2RhcmsnXSkgJjpub3QoW2RhdGEtdGhlbWU9J2xpZ2h0J10pOm5vdChbZGF0YS10aGVtZT0nZGFyayddKSB7XG4gICAgQGluY2x1ZGUgZGFyay1wYWxldHRlO1xuICB9XG5cbiAgLy8gdGhlbWU9XCJkYXJrXCIgLyB0aGVtZT1cImxpZ2h0XCI6IHBpbm5lZCBleHBsaWNpdGx5IG9uIHRoaXMgaW5zdGFuY2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIE9TIG9yIHRoZSBhcHBcbiAgJltkYXRhLXRoZW1lPSdkYXJrJ10ge1xuICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgfVxuICAmW2RhdGEtdGhlbWU9J2xpZ2h0J10ge1xuICAgIEBpbmNsdWRlIGxpZ2h0LXBhbGV0dGU7XG4gIH1cblxuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMjBweDtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIEludGVyLCAnSGVsdmV0aWNhIE5ldWUnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgY29sb3I6IHZhcigtLXRleHQpO1xufVxuXG5AbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkge1xuICAucm9vdCwgLnJvb3QgKiwgLnJvb3QgKjo6YmVmb3JlLCAucm9vdCAqOjphZnRlciB7XG4gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDtcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjAxbXMgIWltcG9ydGFudDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT0gUmVjZW50cyAoZmF2b3JpdGVzKSA9PT09PT09PT09PT1cbi5yZWNlbnRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA3cHg7XG4gIG1pbi1oZWlnaHQ6IDMwcHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBwYWRkaW5nOiA1cHggOHB4O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgdmFyKC0tc2hhZG93LXNvZnQpO1xuICAvLyBgd2lkdGhgIGlzIHNldCBpbmxpbmUgZnJvbSBDb2xvcldoZWVsLnRzeCAoY2hpcCBjb3VudCAqIHNpemUgKyBnYXBzKSAtLVxuICAvLyB0cmFuc2l0aW9uaW5nIGl0IHR1cm5zIGFuIGFkZC9yZW1vdmUncyBzaHJpbmstdG8tZml0IHJlc2l6ZSBpbnRvIGFcbiAgLy8gc21vb3RoIHJlc2l6ZSBpbnN0ZWFkIG9mIGFuIGluc3RhbnQgc25hcFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjI1cyBlYXNlO1xufVxuXG4vLyBzYW1lIGJveCAobWluLWhlaWdodCArIHBhZGRpbmcpLCBqdXN0IGludmlzaWJsZSAtLSBrZWVwcyB0aGUgc2xvdCdzXG4vLyBmb290cHJpbnQgcmVzZXJ2ZWQgc28gdGhlIHJlc3Qgb2YgdGhlIGxheW91dCBkb2Vzbid0IHNoaWZ0IHdoZW4gdGhlIGxhc3Rcbi8vIHByZXNldCBpcyByZW1vdmVkIChvciBiZWZvcmUgdGhlIGZpcnN0IG9uZSBpcyBldmVyIGFkZGVkKVxuLnJlY2VudHNFbXB0eSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBib3gtc2hhZG93OiBub25lO1xufVxuXG4uY2hpcFdyYXAge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGZsZXg6IG5vbmU7XG4gIGFuaW1hdGlvbjogY2hpcEluIDAuNHMgY3ViaWMtYmV6aWVyKDAuMzQsIDEuNTYsIDAuNjQsIDEpIGJvdGg7XG59XG5cbi8vIHN3YXBzIGluIGZvciAuY2hpcFdyYXAgd2hpbGUgYSBjaGlwIGlzIGxlYXZpbmcgKHNlZSByZW1vdmVGYXZvcml0ZSAvXG4vLyBoYW5kbGVDaGlwUmVtb3ZlRW5kIGluIENvbG9yV2hlZWwudHN4KSAtLSB0cmFuc2Zvcm0tb25seSwgc28gaXQga2VlcHNcbi8vIG9jY3VweWluZyBpdHMgZmxleCBzbG90IChhbmQgLnJlY2VudHMnIHdpZHRoKSB1bnRpbCBpdCdzIGZ1bGx5IGludmlzaWJsZSxcbi8vIGF0IHdoaWNoIHBvaW50IHRoZSBhY3R1YWwgcmVtb3ZhbCArIC5yZWNlbnRzJyBvd24gd2lkdGggdHJhbnNpdGlvbiBraWNrIGluXG4uY2hpcFdyYXBSZW1vdmluZyB7XG4gIGFuaW1hdGlvbjogY2hpcE91dCAwLjIycyBjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKSBib3RoO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmNoaXAge1xuICB3aWR0aDogMjZweDtcbiAgaGVpZ2h0OiAyNnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4yMiksIHZhcigtLXNoYWRvdy1zb2Z0KTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGVhc2UsIGJveC1zaGFkb3cgMC4xNXMgZWFzZTtcblxuICAmOmhvdmVyIHtcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMTQpIHRyYW5zbGF0ZVkoLTFweCk7XG4gICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4zKSwgMCA0cHggMTBweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgfVxuICAmOmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjAyKTtcbiAgfVxufVxuXG4vLyBub3RpZmljYXRpb24tYmFkZ2Ugc3R5bGU6IHNpdHMgb2ZmLWNlbnRlciBvbiB0aGUgY2hpcCdzIHJpbSwgcmV2ZWFsZWQgb25seVxuLy8gb24gaG92ZXIgc28gaXQgbmV2ZXIgY29tcGV0ZXMgd2l0aCB0aGUgY2hpcCdzIG93biBjbGljay10by1zZWxlY3QgYXJlYVxuLmNoaXBSZW1vdmUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogLTNweDtcbiAgcmlnaHQ6IC0zcHg7XG4gIHdpZHRoOiAxNHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTtcbiAgY29sb3I6IHZhcigtLXRleHQtZGltKTtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zKSwgaW5zZXQgMCAwIDAgMXB4IHJnYmEoMTI4LCAxMjgsIDEyOCwgMC4yNSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgei1pbmRleDogMjtcbiAgb3BhY2l0eTogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHRyYW5zZm9ybTogc2NhbGUoMC42KTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjEycyBlYXNlLCB0cmFuc2Zvcm0gMC4xMnMgZWFzZSwgY29sb3IgMC4xMnMgZWFzZTtcblxuICBzdmcge1xuICAgIHdpZHRoOiA4cHg7XG4gICAgaGVpZ2h0OiA4cHg7XG4gIH1cbiAgJjpob3ZlciB7XG4gICAgY29sb3I6IHZhcigtLXRleHQpO1xuICB9XG4gIC5jaGlwV3JhcDpob3ZlciAmIHtcbiAgICBvcGFjaXR5OiAxO1xuICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7XG4gIH1cbn1cblxuQGtleWZyYW1lcyBjaGlwSW4ge1xuICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMCkgcm90YXRlKC0yNWRlZyk7IG9wYWNpdHk6IDA7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDApOyBvcGFjaXR5OiAxOyB9XG59XG5cbkBrZXlmcmFtZXMgY2hpcE91dCB7XG4gIDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKSByb3RhdGUoMCk7IG9wYWNpdHk6IDE7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMCkgcm90YXRlKDE4ZGVnKTsgb3BhY2l0eTogMDsgfVxufVxuXG4vLyA9PT09PT09PT09PT0gUGlja2VyOiBwb3NpdGlvbmluZyBjb250ZXh0IGZvciB0aGUgcmluZydzIGJsZWVkID09PT09PT09PT09PVxuLy8gRXZlcnkgZGlyZWN0IGNoaWxkIGJlbG93IGlzIHBvc2l0aW9uOmFic29sdXRlICh0aGVyZSdzIG5vIGJhY2tpbmcgY2FyZCB0b1xuLy8gaG9sZCB0aGUgYm94IG9wZW4pLCBzbyAucGlja2VyIG5lZWRzIGFuIGV4cGxpY2l0IHNpemUgb3IgaXQgbWVhc3VyZXMgYXNcbi8vIDB4MCB0byB0aGUgbGF5b3V0IGVuZ2luZSAtLSBtYXJnaW4tdG9wIHJlc2VydmVzIHJvb20gZm9yIHdoYXQgcmVuZGVyc1xuLy8gYWJvdmUgdGhlIHNoYXJlZCBjZW50ZXIgYW5jaG9yIChtb3N0bHkgdGhlIG1vZGUgdG9nZ2xlKS4gYGhlaWdodGAgaXMgc2V0XG4vLyBpbmxpbmUgZnJvbSBDb2xvcldoZWVsLnRzeCBpbnN0ZWFkIG9mIGhlcmUsIHNpbmNlIGhvdyBmYXIgZG93biBpdCBuZWVkcyB0b1xuLy8gcmVzZXJ2ZSBkZXBlbmRzIG9uIGBhcmNWaXNpYmxlYCAodGhlIGFscGhhIGFyYyByZWFjaGVzIGxvd2VyIHRoYW4gdGhlIHJpbmdcbi8vIGFsb25lIGRvZXMpIC0tIHBsYWluIFNDU1MgY2FuJ3Qgc2VlIHRoYXQgcHJvcC5cbi5waWNrZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi10b3A6IDk2cHg7XG4gIHdpZHRoOiAyNzJweDtcbn1cblxuLmdsb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAzNDBweDtcbiAgaGVpZ2h0OiAzNDBweDtcbiAgbGVmdDogNTAlO1xuICB0b3A6IDg4cHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG9wYWNpdHk6IDAuNTU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiAwO1xufVxuXG4vLyA9PT09PT09PT09PT0gTW9kZSB0b2dnbGU6IHN3aXRjaGVzIHdoYXQgdGhlIHJpbmcgYWRqdXN0cyAoSC9TL1YpID09PT09PT09PT09PVxuLm1vZGVUb2dnbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSAxNzBweCkpO1xuICB6LWluZGV4OiAzO1xuICBkaXNwbGF5OiBncmlkO1xuICAvLyBncmlkLXRlbXBsYXRlLWNvbHVtbnMgYW5kIHdpZHRoIGFyZSBzZXQgaW5saW5lIChtb2RlIGNvdW50IGlzIGR5bmFtaWM6XG4gIC8vIDMtd2F5IEgvUy9WIG9yIDQtd2F5IEgvUy9WL0EgZGVwZW5kaW5nIG9uIHNob3dBbHBoYUNvbnRyb2wpXG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBwYWRkaW5nOiAzcHg7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLCB2YXIoLS1zaGFkb3ctc29mdCk7XG59XG5cbi5tb2RlUGlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAzcHg7XG4gIGJvdHRvbTogM3B4O1xuICBsZWZ0OiAzcHg7XG4gIC8vIHdpZHRoIGlzIHNldCBpbmxpbmUgKHNlZSAubW9kZVRvZ2dsZSlcbiAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UpO1xuICBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctc29mdCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cyBjdWJpYy1iZXppZXIoMC4yLCAwLjgsIDAuMiwgMSk7XG59XG5cbi5tb2RlQnV0dG9uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAyMnB4O1xuICBiYWNrZ3JvdW5kOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtc2l6ZTogMTAuNXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsaW5lLWhlaWdodDogMjJweDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgY29sb3I6IHZhcigtLXRleHQtZGltKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzIGVhc2U7XG5cbiAgJi5hY3RpdmUge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxuICAmOmhvdmVyOm5vdCguYWN0aXZlKSB7XG4gICAgY29sb3I6IHZhcigtLXRleHQpO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PSBTdGFnZTogYSB0cnVlIHJpbmcgKGFubnVsdXMgdmlhIG1hc2spID09PT09PT09PT09PVxuLnN0YWdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC00OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyNzJweDtcbiAgaGVpZ2h0OiAyNzJweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG59XG5cbi8vIHNoYWRvdyBjYXN0ZXI6IGEgcGxhaW4sIHVubWFza2VkIGNpcmNsZSBiZWhpbmQgdGhlIHJpbmcuIGJveC1zaGFkb3cgZHJhd3Ncbi8vIG91dHNpZGUgaXRzIGJvcmRlci1ib3ggcmVnYXJkbGVzcyBvZiB0aGUgaG9sZSBpbiB0aGUgc2hhcGUgZHJhd24gb24gdG9wIG9mXG4vLyBpdCwgc28gdGhpcyByZWxpYWJseSBjYXN0cyBhIHNoYWRvdyBhcm91bmQgdGhlIHJpbmcncyBvdXRlciBlZGdlIC0tXG4vLyBmaWx0ZXI6ZHJvcC1zaGFkb3cgb24gdGhlIG1hc2tlZCAucmluZyBpdHNlbGYgaXMgdW5yZWxpYWJsZSBhY3Jvc3MgZW5naW5lcy5cbi5zdGFnZVNoYWRvdyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4yMiksIDAgMTBweCAxOHB4IHJnYmEoMCwgMCwgMCwgMC4yMik7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4ucmluZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHotaW5kZXg6IDI7XG4gIC8vIGJhY2tncm91bmQgaXMgc2V0IHBlci1tb2RlIGlubGluZTogaHVlIHNwZWN0cnVtIC8gZ3JleS10by1jb2xvciAvIGJsYWNrLXRvLWNvbG9yXG4gIC13ZWJraXQtbWFzazogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBjbG9zZXN0LXNpZGUsIHRyYW5zcGFyZW50IDAgOTJweCwgYmxhY2sgOTNweCAxMDAlKTtcbiAgbWFzazogcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBjbG9zZXN0LXNpZGUsIHRyYW5zcGFyZW50IDAgOTJweCwgYmxhY2sgOTNweCAxMDAlKTtcbn1cblxuLy8gcm90YXRlZCwgbm90IHJlcG9zaXRpb25lZCB2aWEgdG9wL2xlZnQgLS0gc2VlIHRoZSBjb21tZW50IG9uXG4vLyByaW5nQW5nbGVGcm9tVG9wRGVnIGluIENvbG9yV2hlZWwudHN4IGZvciB3aHlcbi5odWVIYW5kbGVQaXZvdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDA7XG4gIGhlaWdodDogMDtcbiAgLy8gYHRyYW5zZm9ybWAgY3JlYXRlcyBhIG5ldyBzdGFja2luZyBjb250ZXh0LCBzbyB0aGlzIG5lZWRzIGl0cyBvd25cbiAgLy8gei1pbmRleCAtLSB0aGUgY2hpbGQgLmh1ZUhhbmRsZSdzIHotaW5kZXggb25seSByYW5rcyBpdCB3aXRoaW4gdGhpc1xuICAvLyBjb250ZXh0LCBub3QgYWdhaW5zdCB0aGUgcmluZy9kaXNjL2JhZGdlcyBzaXR0aW5nIG91dHNpZGUgaXRcbiAgei1pbmRleDogMztcbiAgLy8gc3Ryb25nIGVhc2Utb3V0IC0tIGZhc3Qgc3RhcnQsIGxvbmcgZGVjZWxlcmF0aW9uIGludG8gdGhlIGZpbmFsIGFuZ2xlLFxuICAvLyBsaWtlIGJyYWtpbmcgaW50byBwb3NpdGlvbi4gUmVhZHMgYXMgYSByZWFsIHN3ZWVwIG9uIGEgYmlnIG1vZGUtc3dpdGNoXG4gIC8vIGp1bXAsIHN0YXlzIHNuYXBweSBvbiBzbWFsbCB3aGVlbC10aWNrIG51ZGdlcy5cbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMzJzIGN1YmljLWJlemllcigwLjE2LCAxLCAwLjMsIDEpO1xufVxuLnJvb3RbZGF0YS1kcmFnZ2luZz0ndHJ1ZSddIC5odWVIYW5kbGVQaXZvdCB7XG4gIHRyYW5zaXRpb246IG5vbmU7XG59XG4uaHVlSGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0xMTRweDsgLy8gbWlkLWJhbmQgcmFkaXVzICgwLjQxOTEgKiAyNzJweCBzdGFnZSksIGZpeGVkIGRpc3RhbmNlIGZyb20gdGhlIHBpdm90XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiAzcHggc29saWQgI2ZmZjtcbiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC40KSwgMCAwIDAgMXB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBjdXJzb3I6IGdyYWI7XG4gIHotaW5kZXg6IDM7XG59XG5cbi8vID09PT09PT09PT09PSBBbHBoYSBhcmM6IGEgY3VydmVkIGFscGhhIHNsaWRlciBvdXRzaWRlIHRoZSByaW5nID09PT09PT09PT09PVxuLy8gYSBwdXJlIDFEIGNvbnRyb2wsIHBvc2l0aW9uIGFsb25nIHRoZSAxMjBkZWcgYmFuZCAoYm90dG9tLWNlbnRlcmVkKSBmYWRlc1xuLy8gYSBjaGVja2VyYm9hcmQgKGFscGhhIDApIGludG8gdGhlIGN1cnJlbnQgc29saWQgY29sb3IgKGFscGhhIDEpLiBjbGlwLXBhdGhcbi8vIGFsc28gZ2F0ZXMgaGl0LXRlc3RpbmcsIHNvIGNsaWNrcyBvdXRzaWRlIHRoZSB2aXNpYmxlIGNyZXNjZW50IGZhbGwgdGhyb3VnaC5cbiRhcmNQYXRoOiBwYXRoKCdNIDMyOC41NiwyNzAgQSAxNjAgMTYwIDAgMCAxIDUxLjQ0LDI3MCBMIDY1LjI5LDI2MiBBIDE0NCAxNDQgMCAwIDAgMzE0LjcxLDI2MiBaJyk7XG5cbi8vIHNoYWRvdyBjYXN0ZXI6IGNsaXAtcGF0aCArIGZpbHRlcjpibHVyIG9uIHRoZSBTQU1FIGVsZW1lbnQgY2xpcHMgYXdheSB0aGVcbi8vIGJsdXIncyBvd24gc29mdCBlZGdlIChubyByb29tIG91dHNpZGUgdGhlIHBhdGggZm9yIGl0IHRvIGZhZGUgaW50byksXG4vLyBsZWF2aW5nIGEgaGFyZC1lZGdlZCBzbXVkZ2UuIEZpeDogYmx1ciBhIHdyYXBwZXIgdGhhdCBJU04nVCBpdHNlbGYgY2xpcHBlZFxuLy8gLS0gaXQgY29tcG9zaXRlcyBpdHMgY2xpcHBlZCBjaGlsZCBmaXJzdCwgdGhlbiBibHVycyB0aGF0IHdob2xlIHJlc3VsdFxuLy8gZnJlZWx5LCBzaW5jZSBub3RoaW5nIGNsaXBzIHRoZSB3cmFwcGVyIGFmdGVyd2FyZC5cbi5hbHBoYUFyY1NoYWRvd1dyYXAge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGhlaWdodDogMzgwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTUwJSArIDFweCksIGNhbGMoLTUwJSArIDVweCkpO1xuICB6LWluZGV4OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgZmlsdGVyOiBibHVyKDdweCk7XG59XG4uYWxwaGFBcmNTaGFkb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBjbGlwLXBhdGg6ICRhcmNQYXRoO1xufVxuXG4uYWxwaGFBcmMge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGhlaWdodDogMzgwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICB0b3VjaC1hY3Rpb246IG5vbmU7XG4gIGN1cnNvcjogZ3JhYjtcbiAgei1pbmRleDogMjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbiAgY2xpcC1wYXRoOiAkYXJjUGF0aDtcbn1cblxuLmFscGhhQXJjRmlsbCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIC8vIGNvbmljLWdyYWRpZW50IHNldCBpbmxpbmUgKG5lZWRzIHRoZSBsaXZlIGFjY2VudCBjb2xvcilcbn1cblxuLy8gY2xpcC1wYXRoIGNhbid0IHRha2UgYSBib3JkZXItcmFkaXVzLCBzbyB0aGUgYmFuZCdzIHR3byBmbGF0LWN1dCBlbmRzIGFyZVxuLy8gXCJyb3VuZGVkXCIgYnkgY2FwcGluZyB0aGVtIHdpdGggcGxhaW4gY2lyY2xlcyBzaXplZCB0byB0aGUgYmFuZCdzIG93blxuLy8gdGhpY2tuZXNzIC0tIGEgcGlsbCBjYXAsIHNhbWUgdHJpY2sgYXMgYSByb3VuZGVkLWVuZCBzdHJva2UuIFRoZXNlIHNpdFxuLy8gT1VUU0lERSAuYWxwaGFBcmMgKGl0cyBjbGlwLXBhdGggd291bGQgc2xpY2UgdGhlbSB0b28pLCBwb3NpdGlvbmVkIGZyb21cbi8vIHRoZSBzaGFyZWQgY2VudGVyIHBvaW50IGxpa2UgdGhlIG1vZGUgdG9nZ2xlIGlzLlxuLmFscGhhQXJjQ2FwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE2cHg7XG4gIGhlaWdodDogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICB6LWluZGV4OiAyO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZS0yKTtcbn1cbi5hbHBoYUFyY0NhcFN0YXJ0IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtNTAlICsgMTMxLjZweCksIGNhbGMoLTUwJSArIDc2cHgpKTtcbiAgLy8gYmFja2dyb3VuZCBzZXQgaW5saW5lIChhY2NlbnQtc29saWQsIHRoZSBcImZ1bGxcIiBlbmQpXG59XG4uYWxwaGFBcmNDYXBFbmQge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgLSAxMzEuNnB4KSwgY2FsYygtNTAlICsgNzZweCkpO1xufVxuXG4vLyBzaXRzIE9VVFNJREUgLmFscGhhQXJjIHRvbywgc2FtZSByZWFzb24gYXMgdGhlIGNhcHMgLS0gY2xpcC1wYXRoIHdvdWxkXG4vLyBzbGljZSBpdCBpbnRvIGEgY3Jlc2NlbnQgd2hlbmV2ZXIgaXQgbmVhcnMgdGhlIGJhbmQncyBmbGF0LWN1dCBlbmRzXG4uYWxwaGFBcmNIYW5kbGUge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogODhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMThweDtcbiAgaGVpZ2h0OiAxOHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIDAuNSksIDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIHotaW5kZXg6IDM7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xMnMgZWFzZTtcbn1cbi5yb290W2RhdGEtZHJhZ2dpbmc9J3RydWUnXSAuYWxwaGFBcmNIYW5kbGUge1xuICB0cmFuc2l0aW9uOiBub25lO1xufVxuXG4vLyA9PT09PT09PT09PT0gQ3VycmVudC1jb2xvciBkaXNjID09PT09PT09PT09PVxuLmN1cnJlbnREaXNjIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMTU2cHg7XG4gIGhlaWdodDogMTU2cHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgei1pbmRleDogMjtcbiAgYm94LXNoYWRvdzogMCAxMHB4IDI0cHggLThweCByZ2JhKDIwLCAxNiwgMTAsIDAuNCksIGluc2V0IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xuICBiYWNrZ3JvdW5kLWltYWdlOlxuICAgIGxpbmVhci1ncmFkaWVudCg0NWRlZywgdmFyKC0tY2hlY2stYSkgMjUlLCB0cmFuc3BhcmVudCAyNSUsIHRyYW5zcGFyZW50IDc1JSwgdmFyKC0tY2hlY2stYSkgNzUlKSxcbiAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHZhcigtLWNoZWNrLWEpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoZWNrLWEpIDc1JSk7XG4gIGJhY2tncm91bmQtc2l6ZTogMTJweCAxMnB4O1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDAsIDZweCA2cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNoZWNrLWIpO1xufVxuXG4uZGlzY0ZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICAvLyBiYWNrZ3JvdW5kIChyZ2JhIG9mIGN1cnJlbnQgY29sb3IsIHNvIHRoZSBjaGVja2VyYm9hcmQgcmVhZHMgdGhyb3VnaFxuICAvLyB3aGVuIGFscGhhIDwgMSkgc2V0IGlubGluZVxufVxuXG4uY3VycmVudEhleCxcbi5jdXJyZW50SGV4SW5wdXQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAxO1xuICBmb250LWZhbWlseTogJ1NGIE1vbm8nLCAnSUJNIFBsZXggTW9ubycsICdKZXRCcmFpbnMgTW9ubycsIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDE3cHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG4gIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gIHRleHQtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE1KTtcbiAgLy8gY29sb3Igc2V0IGlubGluZSAoY29tcHV0ZWQgZm9yIGNvbnRyYXN0IGFnYWluc3QgdGhlIGN1cnJlbnQgY29sb3IpXG59XG4uY3VycmVudEhleCB7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogdGV4dDtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTVzIGN1YmljLWJlemllcigwLjM0LCAxLjU2LCAwLjY0LCAxKTtcblxuICAmLmNvcGllZCB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjA2KTtcbiAgfVxufVxuLmN1cnJlbnRIZXhJbnB1dCB7XG4gIHotaW5kZXg6IDI7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMDtcblxuICAmOjpzZWxlY3Rpb24ge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4zNSk7XG4gIH1cbn1cblxuLy8gYmFkZ2VzIHJlc3RpbmcgaW5sYW5kIG9uIHRoZSBkaXNjLCB0b3AgKGV5ZWRyb3BwZXIpIGFuZCBib3R0b20gKHNhdmUgdG9cbi8vIGZhdm9yaXRlcykgLS0gZGlzY3JlZXQ6IG5lYXItaW52aXNpYmxlIGZpbGwsIGFuZCBpbnN0ZWFkIG9mIGEgZHJhd24tb25cbi8vIGJvcmRlciwgYW4gZW5ncmF2ZWQgZ3Jvb3ZlIChkYXJrIGluc2V0IGxpcCBvbiB0b3AsIGZhaW50IGhpZ2hsaWdodCBvbiB0aGVcbi8vIGJvdHRvbSBlZGdlKSBzbyB0aGV5IHJlYWQgYXMgY2FydmVkIGludG8gdGhlIGRpc2MgcmF0aGVyIHRoYW4gc3R1Y2sgb24gaXRcbi5kaXNjQmFkZ2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAzNHB4O1xuICBoZWlnaHQ6IDM0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgYm9yZGVyOiBub25lO1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDM7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlLCBmaWx0ZXIgMC4xNXMgZWFzZTtcblxuICAmOmhvdmVyIHtcbiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4xNSk7XG4gIH1cbiAgc3ZnIHtcbiAgICB3aWR0aDogMTVweDtcbiAgICBoZWlnaHQ6IDE1cHg7XG4gIH1cbn1cbi5kaXNjQmFkZ2VUb3Age1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSk7XG4gICY6YWN0aXZlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMC45Mik7XG4gIH1cbiAgJi5wdWxzZSB7XG4gICAgYW5pbWF0aW9uOiBiYWRnZVB1bHNlVG9wIDAuNHMgZWFzZTtcbiAgfVxufVxuLmRpc2NCYWRnZUJvdHRvbSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSArIDQ2cHgpKTtcbiAgJjphY3RpdmUge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSArIDQ2cHgpKSBzY2FsZSgwLjkyKTtcbiAgfVxufVxuQGtleWZyYW1lcyBiYWRnZVB1bHNlVG9wIHtcbiAgMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMSk7IH1cbiAgNDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEuMjgpOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgLSA0NnB4KSkgc2NhbGUoMSk7IH1cbn1cbiJdfQ== */","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","// 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\n// .picker's own height -- SCSS can't react to `arcVisible`, so it's set\n// inline instead. With the arc showing, reserve down to its visible crescent\n// (this value is chosen to match the arc's clipped band + handle, empirically\n// -- see the $arcPath comment in ColorWheel.module.scss). With it hidden,\n// shrink back to the ring's own real bottom edge (.stage's `top: -48px` +\n// `height: 272px` in the same file) so a consumer measuring .picker's box\n// (hit-testing, backdrops) doesn't get dead space below the ring.\nconst PICKER_HEIGHT_WITH_ARC = 265;\nconst PICKER_HEIGHT_NO_ARC = 224;\n\n// .recents' content width (excludes its own padding, see .recents in the\n// SCSS) -- set explicitly (instead of left to shrink-to-fit) so a change in\n// chip count is a `width` transition rather than an instant snap\nconst CHIP_SIZE = 26;\nconst CHIP_GAP = 7;\nfunction recentsContentWidth(chipCount: number): number {\n return chipCount > 0 ? chipCount * CHIP_SIZE + (chipCount - 1) * CHIP_GAP : 0;\n}\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 // hexes currently mid-exit-animation -- still rendered (and still counted\n // toward .recents' width) until their chipOut animation finishes, at which\n // point they're actually dropped via onFavoritesChange\n const [removingHexes, setRemovingHexes] = useState<Set<string>>(new Set());\n // starts at 0 so .recents' first paint has something for the width\n // `transition` to animate FROM -- flipped true a couple frames later (a\n // transition can't animate the very first value an element ever renders\n // with, only a change away from one already on screen)\n const [recentsGrown, setRecentsGrown] = useState(false);\n const recentsGrowRaf = useRef(0);\n useEffect(() => {\n recentsGrowRaf.current = requestAnimationFrame(() => {\n recentsGrowRaf.current = requestAnimationFrame(() => setRecentsGrown(true));\n });\n return () => cancelAnimationFrame(recentsGrowRaf.current);\n }, []);\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 // don't drop it from the list yet -- just mark it as leaving, so it stays\n // mounted (and .recents stays at its current width) through the chipOut\n // animation. handleChipRemoveEnd does the actual removal once it's done.\n setRemovingHexes((prev) => new Set(prev).add(hex));\n }\n\n function handleChipRemoveEnd(hex: string) {\n setRemovingHexes((prev) => {\n if (!prev.has(hex)) return prev;\n const next = new Set(prev);\n next.delete(hex);\n return next;\n });\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 {/* Reserved whenever the favorites feature is actually wired up (there's\n an onFavoritesChange to call), not just when there's currently\n something in it -- so the ring/toggle below never shift position as\n presets are added or removed. Empty is just visually hidden\n (.recentsEmpty), the box footprint stays. A read-only preset list\n (favorites passed without onFavoritesChange, so it can never change\n at runtime) only needs the slot while it's non-empty. */}\n {(favorites.length > 0 || onFavoritesChange) && (\n <div\n className={[styles.recents, favorites.length === 0 ? styles.recentsEmpty : \"\"].join(\" \")}\n style={{ width: recentsGrown ? recentsContentWidth(favorites.length) : 0 }}\n >\n {favorites.map((hex, i) => (\n // keyed by hex alone (not index) so an add/remove -- which\n // shifts every other item's index -- doesn't remount and replay\n // the entrance animation on chips that were already there; only\n // a genuinely new hex mounts fresh and animates in\n <div\n key={hex}\n className={[styles.chipWrap, removingHexes.has(hex) ? styles.chipWrapRemoving : \"\"].join(\" \")}\n style={{ animationDelay: removingHexes.has(hex) ? undefined : `${i * 0.05}s` }}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && e.animationName.includes(\"chipOut\")) handleChipRemoveEnd(hex);\n }}\n >\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} style={{ height: arcVisible ? PICKER_HEIGHT_WITH_ARC : PICKER_HEIGHT_NO_ARC }}>\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
+ {"version":3,"sources":["../src/components/Button/Button.module.scss","../src/components/Button/Button.tsx","../src/components/Input/Input.module.scss","../src/components/Input/Input.tsx","../src/components/Badge/Badge.module.scss","../src/components/Badge/Badge.tsx","../src/components/RainCanvas/RainCanvas.module.scss","../src/components/RainCanvas/RainCanvas.tsx","../src/components/Timeline/Timeline.module.scss","../src/utils/color.ts","../src/components/Timeline/Timeline.tsx","../src/components/ColorPicker/ColorPicker.module.scss","../src/components/SliderControl/SliderControl.module.scss","../src/components/SliderControl/SliderControl.tsx","../src/components/ColorPicker/ColorPicker.tsx","../src/components/SlidingCounter/SlidingCounter.module.scss","../src/components/SlidingCounter/SlidingCounter.tsx","../src/components/RichTextEditor/RichTextEditor.module.scss","../src/components/RichTextEditor/RichTextEditor.tsx","../node_modules/@tiptap/core/src/helpers/createChainableState.ts","../node_modules/@tiptap/core/src/CommandManager.ts","../node_modules/@tiptap/core/src/commands/index.ts","../node_modules/@tiptap/core/src/commands/blur.ts","../node_modules/@tiptap/core/src/commands/clearContent.ts","../node_modules/@tiptap/core/src/commands/clearNodes.ts","../node_modules/@tiptap/core/src/commands/command.ts","../node_modules/@tiptap/core/src/commands/createParagraphNear.ts","../node_modules/@tiptap/core/src/commands/cut.ts","../node_modules/@tiptap/core/src/commands/deleteCurrentNode.ts","../node_modules/@tiptap/core/src/helpers/getNodeType.ts","../node_modules/@tiptap/core/src/commands/deleteNode.ts","../node_modules/@tiptap/core/src/commands/deleteRange.ts","../node_modules/@tiptap/core/src/commands/deleteSelection.ts","../node_modules/@tiptap/core/src/commands/enter.ts","../node_modules/@tiptap/core/src/commands/exitCode.ts","../node_modules/@tiptap/core/src/utilities/isRegExp.ts","../node_modules/@tiptap/core/src/utilities/objectIncludes.ts","../node_modules/@tiptap/core/src/helpers/getMarkRange.ts","../node_modules/@tiptap/core/src/helpers/getMarkType.ts","../node_modules/@tiptap/core/src/commands/extendMarkRange.ts","../node_modules/@tiptap/core/src/commands/first.ts","../node_modules/@tiptap/core/src/helpers/isTextSelection.ts","../node_modules/@tiptap/core/src/utilities/minMax.ts","../node_modules/@tiptap/core/src/helpers/resolveFocusPosition.ts","../node_modules/@tiptap/core/src/utilities/isAndroid.ts","../node_modules/@tiptap/core/src/utilities/isiOS.ts","../node_modules/@tiptap/core/src/utilities/isSafari.ts","../node_modules/@tiptap/core/src/commands/focus.ts","../node_modules/@tiptap/core/src/commands/forEach.ts","../node_modules/@tiptap/core/src/commands/insertContent.ts","../node_modules/@tiptap/core/src/utilities/elementFromString.ts","../node_modules/@tiptap/core/src/helpers/createNodeFromContent.ts","../node_modules/@tiptap/core/src/helpers/selectionToInsertionEnd.ts","../node_modules/@tiptap/core/src/commands/insertContentAt.ts","../node_modules/@tiptap/core/src/commands/join.ts","../node_modules/@tiptap/core/src/commands/joinItemBackward.ts","../node_modules/@tiptap/core/src/commands/joinItemForward.ts","../node_modules/@tiptap/core/src/commands/joinTextblockBackward.ts","../node_modules/@tiptap/core/src/commands/joinTextblockForward.ts","../node_modules/@tiptap/core/src/utilities/isMacOS.ts","../node_modules/@tiptap/core/src/commands/keyboardShortcut.ts","../node_modules/@tiptap/core/src/helpers/isNodeActive.ts","../node_modules/@tiptap/core/src/commands/lift.ts","../node_modules/@tiptap/core/src/commands/liftEmptyBlock.ts","../node_modules/@tiptap/core/src/commands/liftListItem.ts","../node_modules/@tiptap/core/src/commands/newlineInCode.ts","../node_modules/@tiptap/core/src/helpers/getSchemaTypeNameByName.ts","../node_modules/@tiptap/core/src/utilities/deleteProps.ts","../node_modules/@tiptap/core/src/commands/resetAttributes.ts","../node_modules/@tiptap/core/src/commands/scrollIntoView.ts","../node_modules/@tiptap/core/src/commands/selectAll.ts","../node_modules/@tiptap/core/src/commands/selectNodeBackward.ts","../node_modules/@tiptap/core/src/commands/selectNodeForward.ts","../node_modules/@tiptap/core/src/commands/selectParentNode.ts","../node_modules/@tiptap/core/src/commands/selectTextblockEnd.ts","../node_modules/@tiptap/core/src/commands/selectTextblockStart.ts","../node_modules/@tiptap/core/src/helpers/createDocument.ts","../node_modules/@tiptap/core/src/commands/setContent.ts","../node_modules/@tiptap/core/src/helpers/getMarkAttributes.ts","../node_modules/@tiptap/core/src/helpers/combineTransactionSteps.ts","../node_modules/@tiptap/core/src/helpers/defaultBlockAt.ts","../node_modules/@tiptap/core/src/helpers/findParentNodeClosestToPos.ts","../node_modules/@tiptap/core/src/helpers/findParentNode.ts","../node_modules/@tiptap/core/src/helpers/getExtensionField.ts","../node_modules/@tiptap/core/src/utilities/isFunction.ts","../node_modules/@tiptap/core/src/utilities/callOrReturn.ts","../node_modules/@tiptap/core/src/helpers/splitExtensions.ts","../node_modules/@tiptap/core/src/utilities/mergeAttributes.ts","../node_modules/@tiptap/core/src/helpers/getTextBetween.ts","../node_modules/@tiptap/core/src/helpers/getTextSerializersFromSchema.ts","../node_modules/@tiptap/core/src/utilities/removeDuplicates.ts","../node_modules/@tiptap/core/src/helpers/getChangedRanges.ts","../node_modules/@tiptap/core/src/helpers/getSplittedAttributes.ts","../node_modules/@tiptap/core/src/helpers/isMarkActive.ts","../node_modules/@tiptap/core/src/helpers/isList.ts","../node_modules/@tiptap/core/src/helpers/isNodeEmpty.ts","../node_modules/@tiptap/core/src/commands/setMark.ts","../node_modules/@tiptap/core/src/commands/setMeta.ts","../node_modules/@tiptap/core/src/commands/setNode.ts","../node_modules/@tiptap/core/src/commands/setNodeSelection.ts","../node_modules/@tiptap/core/src/commands/setTextDirection.ts","../node_modules/@tiptap/core/src/commands/setTextSelection.ts","../node_modules/@tiptap/core/src/commands/sinkListItem.ts","../node_modules/@tiptap/core/src/commands/splitBlock.ts","../node_modules/@tiptap/core/src/commands/splitListItem.ts","../node_modules/@tiptap/core/src/commands/toggleList.ts","../node_modules/@tiptap/core/src/commands/toggleMark.ts","../node_modules/@tiptap/core/src/commands/toggleNode.ts","../node_modules/@tiptap/core/src/commands/toggleWrap.ts","../node_modules/@tiptap/core/src/commands/undoInputRule.ts","../node_modules/@tiptap/core/src/commands/unsetAllMarks.ts","../node_modules/@tiptap/core/src/commands/unsetMark.ts","../node_modules/@tiptap/core/src/commands/unsetTextDirection.ts","../node_modules/@tiptap/core/src/commands/updateAttributes.ts","../node_modules/@tiptap/core/src/commands/wrapIn.ts","../node_modules/@tiptap/core/src/commands/wrapInList.ts","../node_modules/@tiptap/core/src/utilities/isPlainObject.ts","../node_modules/@tiptap/core/src/utilities/mergeDeep.ts","../node_modules/@tiptap/core/src/Extendable.ts","../node_modules/@tiptap/core/src/Mark.ts","../node_modules/@tiptap/core/src/extensions/index.ts","../node_modules/@tiptap/core/src/Extension.ts","../node_modules/@tiptap/core/src/extensions/clipboardTextSerializer.ts","../node_modules/@tiptap/core/src/extensions/commands.ts","../node_modules/@tiptap/core/src/extensions/delete.ts","../node_modules/@tiptap/core/src/extensions/drop.ts","../node_modules/@tiptap/core/src/extensions/editable.ts","../node_modules/@tiptap/core/src/extensions/focusEvents.ts","../node_modules/@tiptap/core/src/extensions/keymap.ts","../node_modules/@tiptap/core/src/extensions/paste.ts","../node_modules/@tiptap/core/src/extensions/tabindex.ts","../node_modules/@tiptap/core/src/extensions/textDirection.ts","../node_modules/@tiptap/core/src/utilities/markdown/index.ts","../node_modules/@tiptap/core/src/utilities/markdown/attributeUtils.ts","../node_modules/@tiptap/core/src/utilities/markdown/createAtomBlockMarkdownSpec.ts","../node_modules/@tiptap/core/src/utilities/markdown/createBlockMarkdownSpec.ts","../node_modules/@tiptap/core/src/utilities/markdown/createInlineMarkdownSpec.ts","../node_modules/@tiptap/core/src/utilities/markdown/parseIndentedBlocks.ts","../node_modules/@tiptap/core/src/utilities/markdown/renderNestedMarkdownContent.ts","../node_modules/@tiptap/core/src/Node.ts","../src/components/RichTextEditor/extensions/Highlight.ts","../src/components/RichTextEditor/extensions/HighlightButton.tsx","../src/components/RichTextEditor/extensions/PageBreak.ts","../src/components/RichTextEditor/extensions/PageBreakButton.tsx","../src/components/ColorWheel/ColorWheel.module.scss","../src/components/ColorWheel/usePointerDrag.ts","../src/components/ColorWheel/useUnwrappedAngle.ts","../src/components/ColorWheel/colorMath.ts","../src/components/ColorWheel/ColorWheel.tsx"],"names":["button","primary","secondary","danger","ghost","sm","md","lg","fullWidth","loading","spinner","spin","wrapper","label","inputWrapper","input","error","adornment","adornmentEnd","withStart","withEnd","helperText","errorText","React","jsxs","jsx","badge","default","success","warning","dotIndicator","trailCanvas","content","dropContainer","filterId","timeline","vertical","item","track","connector","last","horizontal","dot","iconSlot","completed","dotIn","active","pulse","pending","title","description","connectorHidden","connectorDone","colorPicker","topRow","discWrapper","disc","previewSwatch","eyedropperBtn","inputSection","tabs","tab","tabActive","inputAddon","inputCopyBtn","recents","recentsLabel","swatches","recentSwatch","disabled","icon","trackArea","groove","rail","fill","thumb","thumbDragging","tooltip","tooltipVisible","useRef","useEffect","CheckIcon","useState","rr","gg","bb","useCallback","counter","sign","separator","reelWindow","reel","digitCell","root","readOnly","toolbar","toolbarGroup","divider","toolbarButton","headingButton","bubbleMenu","editorContent","Fragment","command","run","originalCreateParagraphNear","originalExitCode","mark","TextSelection","ProseMirrorNode","Selection","isTextSelection","originalJoinUp","originalJoinDown","originalJoinBackward","originalJoinForward","joinPoint","originalCommand","isActive","originalLift","originalLiftEmptyBlock","originalLiftListItem","originalNewlineInCode","originalSelectNodeBackward","originalSelectNodeForward","originalSelectParentNode","originalSelectTextblockEnd","originalSelectTextblockStart","document","range","NodeSelection","originalSinkListItem","first","newNextTypeAttributes","nextType","canSplit","originalWrapIn","originalWrapInList","Plugin","_a","_b","_c","PluginKey","tr","parseAttributes","serializeAttributes","h","nextIndent","Node","useCurrentEditor","recentsEmpty","chipWrap","chipWrapRemoving","chip","chipRemove","picker","glow","modeToggle","modePill","modeButton","stage","stageShadow","ring","hueHandlePivot","hueHandle","alphaArcShadowWrap","alphaArcShadow","alphaArc","alphaArcFill","alphaArcCap","alphaArcCapStart","alphaArcCapEnd","alphaArcHandle","currentDisc","discFill","currentHex","currentHexInput","copied","discBadge","discBadgeTop","discBadgeBottom","clamp","dragging"],"mappings":"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","file":"index.js","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.button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n font-family: var(--font-family-base);\n font-weight: 500;\n letter-spacing: -0.01em;\n border: 1px solid transparent;\n border-radius: var(--radius-md);\n cursor: pointer;\n transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), box-shadow var(--transition-fast);\n white-space: nowrap;\n text-decoration: none;\n outline-offset: 2px;\n}\n\n.button:focus-visible {\n outline: 2px solid var(--color-primary-500);\n}\n\n.button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Variants */\n.primary {\n background-color: var(--color-primary-600);\n color: var(--color-neutral-0);\n}\n\n.primary:hover:not(:disabled) {\n background-color: var(--color-primary-700);\n}\n\n.secondary {\n background-color: var(--color-neutral-0);\n color: var(--color-neutral-900);\n border-color: var(--color-neutral-200);\n box-shadow: var(--shadow-sm);\n}\n\n.secondary:hover:not(:disabled) {\n background-color: var(--color-neutral-100);\n}\n\n.danger {\n background-color: var(--color-danger-500);\n color: var(--color-neutral-0);\n}\n\n.danger:hover:not(:disabled) {\n background-color: var(--color-danger-600);\n}\n\n.ghost {\n background-color: transparent;\n color: var(--color-neutral-600);\n}\n\n.ghost:hover:not(:disabled) {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n/* Sizes */\n.sm {\n font-size: var(--font-size-xs);\n padding: var(--spacing-1) var(--spacing-3);\n height: 2rem;\n}\n\n.md {\n font-size: var(--font-size-sm);\n padding: var(--spacing-2) var(--spacing-4);\n height: 2.5rem;\n}\n\n.lg {\n font-size: var(--font-size-md);\n padding: var(--spacing-3) var(--spacing-4);\n height: 3rem;\n}\n\n.fullWidth {\n width: 100%;\n}\n\n/* Loading */\n.loading {\n position: relative;\n}\n\n.spinner {\n width: 1em;\n height: 1em;\n border: 2px solid currentColor;\n border-top-color: transparent;\n border-radius: var(--radius-full);\n animation: spin 0.6s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIkJ1dHRvbi5tb2R1bGUuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFUTtBQUtSO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBR0E7RUFHQTtFQUNBOzs7QUFRRjtFQUVFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUNBO0VBSUE7RUFHQTtFQUNBOzs7QUNqR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUVGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTs7O0FBRUY7RUFDRTtFQUNBOzs7QUFHRjtBQUNBO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0FBQ0E7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7SUFDRSIsInNvdXJjZXNDb250ZW50IjpbIkB1c2UgXCJzYXNzOmNvbG9yXCI7XG5cbkBpbXBvcnQgdXJsKFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1JbnRlcjp3Z2h0QDQwMDs1MDA7NjAwJmRpc3BsYXk9c3dhcFwiKTtcblxuLy8gQWNjZW50IGRpIGRlZmF1bHQg4oCUIGNhbWJpYSBxdWkgcGVyIGFnZ2lvcm5hcmUgdHV0dGEgbGEgbGlicmVyaWFcbiRhY2NlbnQ6ICMzYjgyZjY7XG5cbjpyb290IHtcbiAgLy8gQWNjZW50IHNjYWxlIOKAlCBkZXJpdmF0YSBkYSAkYWNjZW50IGEgY29tcGlsZSB0aW1lXG4gIC0tYWNjZW50OiAgICAgICAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtZG90OiAgICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWFjY2VudC10cmFjazogICN7JGFjY2VudH07XG4gIC0tYWNjZW50LXJpbmc6ICAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtZ2xvdzogICAje2NvbG9yLmNoYW5nZSgkYWNjZW50LCAkYWxwaGE6IDAuMyl9O1xuICAtLWFjY2VudC1saWdodDogICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDUlLCAkc2F0dXJhdGlvbjogLTIwJSl9O1xuXG4gIC8vIFByaW1hcnkgc2NhbGUgKG1hbnRlbnV0YSBwZXIgcmV0cm9jb21wYXRpYmlsaXTDoCBjb24gQnV0dG9uLCBCYWRnZSwgSW5wdXQpXG4gIC0tY29sb3ItcHJpbWFyeS01MDogICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDklLCAkc2F0dXJhdGlvbjogLTMwJSl9O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQyJSwgJHNhdHVyYXRpb246IC0xNSUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTQwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAxMiUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTUwMDogI3skYWNjZW50fTtcbiAgLS1jb2xvci1wcmltYXJ5LTYwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMTAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS03MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogLTIwJSl9O1xuXG4gIC8vIE5ldXRyYWxcbiAgLS1jb2xvci1uZXV0cmFsLTA6ICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1uZXV0cmFsLTEwMDogI2YzZjRmNjtcbiAgLS1jb2xvci1uZXV0cmFsLTIwMDogI2U1ZTdlYjtcbiAgLS1jb2xvci1uZXV0cmFsLTQwMDogIzljYTNhZjtcbiAgLS1jb2xvci1uZXV0cmFsLTYwMDogIzRiNTU2MztcbiAgLS1jb2xvci1uZXV0cmFsLTkwMDogIzExMTgyNztcblxuICAvLyBTZW1hbnRpY1xuICAtLWNvbG9yLXN1Y2Nlc3MtNTAwOiAjMjJjNTVlO1xuICAtLWNvbG9yLXN1Y2Nlc3MtNjAwOiAjMTZhMzRhO1xuICAtLWNvbG9yLWRhbmdlci01MDA6ICAjZWY0NDQ0O1xuICAtLWNvbG9yLWRhbmdlci02MDA6ICAjZGMyNjI2O1xuICAtLWNvbG9yLXdhcm5pbmctNTAwOiAjZjU5ZTBiO1xuICAtLWNvbG9yLXdhcm5pbmctNjAwOiAjZDk3NzA2O1xuXG4gIC8vIFR5cG9ncmFwaHlcbiAgLS1mb250LWZhbWlseS1iYXNlOiBcIkludGVyXCIsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgc2Fucy1zZXJpZjtcbiAgLS1mb250LXNpemUteHM6IDAuNzVyZW07XG4gIC0tZm9udC1zaXplLXNtOiAwLjg3NXJlbTtcbiAgLS1mb250LXNpemUtbWQ6IDFyZW07XG4gIC0tZm9udC1zaXplLWxnOiAxLjEyNXJlbTtcblxuICAvLyBTcGFjaW5nXG4gIC0tc3BhY2luZy0xOiAwLjI1cmVtO1xuICAtLXNwYWNpbmctMjogMC41cmVtO1xuICAtLXNwYWNpbmctMzogMC43NXJlbTtcbiAgLS1zcGFjaW5nLTQ6IDFyZW07XG5cbiAgLy8gUmFkaXVzXG4gIC0tcmFkaXVzLXNtOiAgIDAuMjVyZW07XG4gIC0tcmFkaXVzLW1kOiAgIDAuMzc1cmVtO1xuICAtLXJhZGl1cy1sZzogICAwLjVyZW07XG4gIC0tcmFkaXVzLWZ1bGw6IDk5OTlweDtcblxuICAvLyBTaGFkb3dzXG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjA1KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuMSk7XG5cbiAgLy8gVHJhbnNpdGlvbnNcbiAgLS10cmFuc2l0aW9uLWZhc3Q6IDE1MG1zIGVhc2U7XG5cbiAgLy8gU3VyZmFjZSAoYmFja2dyb3VuZCBkaSBjYXJkL3BhbmVsKVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICNmZmZmZmY7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogI2ZmZmZmZjtcbn1cblxuLy8g4pSA4pSA4pSAIERhcmsgdGhlbWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBBcHBsaWNhdG8gdmlhIGRhdGEtdGhlbWU9XCJkYXJrXCIgc3VsbCdlbGVtZW50byByb290IChnZXN0aXRvIGRhIFN0b3J5Ym9vayBkZWNvcmF0b3Jcbi8vIGUgZGFsbCdhcHAgY29uc3VtZXIpLiBJIGNvbXBvbmVudGkgbm9uIGRldm9ubyBmYXJlIG51bGxhIGRpIHNwZWNpYWxlOiBiYXN0YSBjaGVcbi8vIHVzaW5vIGkgdG9rZW4gdmFyKCkgZSByaWNldmVyYW5ubyBhdXRvbWF0aWNhbWVudGUgaSB2YWxvcmkgZGFyay5cblxuW2RhdGEtdGhlbWU9XCJkYXJrXCJdIHtcbiAgLy8gTmV1dHJhbCAoc2NhbGEgaW52ZXJ0aXRhKVxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjMGYxNzJhO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjMWUyOTNiO1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjMzM0MTU1O1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOTRhM2I4O1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjY2JkNWUxO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjZjhmYWZjO1xuXG4gIC8vIFN1cmZhY2VcbiAgLS1jb2xvci1zdXJmYWNlOiAgICAgICAgICAjMWUyOTNiO1xuICAtLWNvbG9yLXN1cmZhY2UtZWxldmF0ZWQ6ICMyNzM1NDk7XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSBkYXJrIChwZXIgaWwgZGVmYXVsdCBhY2NlbnQgYmx1IOKAlCBsZSBzZnVtYXR1cmUgY2hpYXJlIGRpdmVudGFubyBzY3VyZSlcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgIzE3MjU1NDtcbiAgLS1jb2xvci1wcmltYXJ5LTEwMDogIzFlM2E4YTtcbiAgLy8gNDAwIC8gNTAwIC8gNjAwIC8gNzAwIHJpbWFuZ29ubyBpbnZhcmlhdGkgKGFiYmFzdGFuemEgc2F0dXJpIHN1IGJnIHNjdXJvKVxuXG4gIC8vIEFjY2VudCBsaWdodDogdmFyaWFudGUgc2N1cmFcbiAgLS1hY2NlbnQtbGlnaHQ6ICMxNzI1NTQ7XG5cbiAgLy8gU2hhZG93cyAocGnDuSBmb3J0aSBzdSBiZyBzY3VybylcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuNCk7XG4gIC0tc2hhZG93LW1kOiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjUpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjQpO1xufVxuIiwiQGltcG9ydCBcIi4uLy4uL3N0eWxlcy90b2tlbnMuc2Nzc1wiO1xuXG4uYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBnYXA6IHZhcigtLXNwYWNpbmctMik7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSxcbiAgICBib3JkZXItY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSwgY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSxcbiAgICBib3gtc2hhZG93IHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgb3V0bGluZS1vZmZzZXQ6IDJweDtcbn1cblxuLmJ1dHRvbjpmb2N1cy12aXNpYmxlIHtcbiAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWNvbG9yLXByaW1hcnktNTAwKTtcbn1cblxuLmJ1dHRvbjpkaXNhYmxlZCB7XG4gIG9wYWNpdHk6IDAuNTtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuLyogVmFyaWFudHMgKi9cbi5wcmltYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItcHJpbWFyeS02MDApO1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbn1cbi5wcmltYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItcHJpbWFyeS03MDApO1xufVxuXG4uc2Vjb25kYXJ5IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG4gIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1zbSk7XG59XG4uc2Vjb25kYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0xMDApO1xufVxuXG4uZGFuZ2VyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItZGFuZ2VyLTUwMCk7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTApO1xufVxuLmRhbmdlcjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWRhbmdlci02MDApO1xufVxuXG4uZ2hvc3Qge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNjAwKTtcbn1cbi5naG9zdDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMTAwKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbn1cblxuLyogU2l6ZXMgKi9cbi5zbSB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXhzKTtcbiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy0xKSB2YXIoLS1zcGFjaW5nLTMpO1xuICBoZWlnaHQ6IDJyZW07XG59XG5cbi5tZCB7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXNtKTtcbiAgcGFkZGluZzogdmFyKC0tc3BhY2luZy0yKSB2YXIoLS1zcGFjaW5nLTQpO1xuICBoZWlnaHQ6IDIuNXJlbTtcbn1cblxuLmxnIHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtbWQpO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTMpIHZhcigtLXNwYWNpbmctNCk7XG4gIGhlaWdodDogM3JlbTtcbn1cblxuLmZ1bGxXaWR0aCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4vKiBMb2FkaW5nICovXG4ubG9hZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLnNwaW5uZXIge1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgYm9yZGVyOiAycHggc29saWQgY3VycmVudENvbG9yO1xuICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICBhbmltYXRpb246IHNwaW4gMC42cyBsaW5lYXIgaW5maW5pdGU7XG59XG5cbkBrZXlmcmFtZXMgc3BpbiB7XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG4iXX0= */","import React from \"react\";\nimport styles from \"./Button.module.scss\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"danger\" | \"ghost\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n disabled,\n children,\n className,\n ...props\n },\n ref\n ) => {\n return (\n <button\n ref={ref}\n disabled={disabled || loading}\n className={[\n styles.button,\n styles[variant],\n styles[size],\n fullWidth ? styles.fullWidth : \"\",\n loading ? styles.loading : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n {...props}\n >\n {loading && <span className={styles.spinner} aria-hidden=\"true\" />}\n {children}\n </button>\n );\n }\n);\n\nButton.displayName = \"Button\";\n","@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: inline-flex;\n flex-direction: column;\n gap: var(--spacing-1);\n}\n\n.fullWidth {\n width: 100%;\n}\n\n.label {\n font-family: var(--font-family-base);\n font-size: var(--font-size-sm);\n font-weight: 500;\n color: var(--color-neutral-900);\n letter-spacing: -0.01em;\n}\n\n.inputWrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.input {\n width: 100%;\n font-family: var(--font-family-base);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n background-color: var(--color-neutral-0);\n color: var(--color-neutral-900);\n outline: none;\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n\n.input::placeholder {\n color: var(--color-neutral-400);\n}\n\n.input:focus {\n border-color: var(--color-primary-500);\n box-shadow: 0 0 0 3px var(--color-primary-100);\n}\n\n.input:disabled {\n background-color: var(--color-neutral-100);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.input.error {\n border-color: var(--color-danger-500);\n}\n\n.input.error:focus {\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);\n}\n\n/* Sizes */\n.sm .input {\n font-size: var(--font-size-xs);\n padding: var(--spacing-1) var(--spacing-2);\n height: 2rem;\n}\n\n.md .input {\n font-size: var(--font-size-sm);\n padding: var(--spacing-2) var(--spacing-3);\n height: 2.5rem;\n}\n\n.lg .input {\n font-size: var(--font-size-md);\n padding: var(--spacing-3) var(--spacing-4);\n height: 3rem;\n}\n\n/* Adornments */\n.adornment {\n position: absolute;\n left: var(--spacing-3);\n display: flex;\n align-items: center;\n color: var(--color-neutral-400);\n pointer-events: none;\n}\n\n.adornmentEnd {\n left: unset;\n right: var(--spacing-3);\n}\n\n.sm .withStart {\n padding-left: 2rem;\n}\n\n.md .withStart {\n padding-left: 2.25rem;\n}\n\n.lg .withStart {\n padding-left: 2.5rem;\n}\n\n.sm .withEnd {\n padding-right: 2rem;\n}\n\n.md .withEnd {\n padding-right: 2.25rem;\n}\n\n.lg .withEnd {\n padding-right: 2.5rem;\n}\n\n.helperText {\n font-family: var(--font-family-base);\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n}\n\n.errorText {\n font-family: var(--font-family-base);\n font-size: var(--font-size-xs);\n color: var(--color-danger-500);\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIklucHV0Lm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ2pHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFOzs7QUFHRjtBQUNBO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFBaUI7OztBQUNqQjtFQUFpQjs7O0FBQ2pCO0VBQWlCOzs7QUFFakI7RUFBZTs7O0FBQ2Y7RUFBZTs7O0FBQ2Y7RUFBZTs7O0FBRWY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3Rva2Vucy5zY3NzXCI7XG5cbi53cmFwcGVyIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogdmFyKC0tc3BhY2luZy0xKTtcbn1cblxuLmZ1bGxXaWR0aCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ubGFiZWwge1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXNtKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07XG59XG5cbi5pbnB1dFdyYXBwZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5pbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgb3V0bGluZTogbm9uZTtcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIHZhcigtLXRyYW5zaXRpb24tZmFzdCksIGJveC1zaGFkb3cgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KTtcbn1cblxuLmlucHV0OjpwbGFjZWhvbGRlciB7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG59XG5cbi5pbnB1dDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItcHJpbWFyeS01MDApO1xuICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY29sb3ItcHJpbWFyeS0xMDApO1xufVxuXG4uaW5wdXQ6ZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTEwMCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIG9wYWNpdHk6IDAuNjtcbn1cblxuLmlucHV0LmVycm9yIHtcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1kYW5nZXItNTAwKTtcbn1cblxuLmlucHV0LmVycm9yOmZvY3VzIHtcbiAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYigyMzkgNjggNjggLyAwLjE1KTtcbn1cblxuLyogU2l6ZXMgKi9cbi5zbSAuaW5wdXQge1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS14cyk7XG4gIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMSkgdmFyKC0tc3BhY2luZy0yKTtcbiAgaGVpZ2h0OiAycmVtO1xufVxuXG4ubWQgLmlucHV0IHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtc20pO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTIpIHZhcigtLXNwYWNpbmctMyk7XG4gIGhlaWdodDogMi41cmVtO1xufVxuXG4ubGcgLmlucHV0IHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtbWQpO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTMpIHZhcigtLXNwYWNpbmctNCk7XG4gIGhlaWdodDogM3JlbTtcbn1cblxuLyogQWRvcm5tZW50cyAqL1xuLmFkb3JubWVudCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogdmFyKC0tc3BhY2luZy0zKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5hZG9ybm1lbnRFbmQge1xuICBsZWZ0OiB1bnNldDtcbiAgcmlnaHQ6IHZhcigtLXNwYWNpbmctMyk7XG59XG5cbi5zbSAud2l0aFN0YXJ0IHsgcGFkZGluZy1sZWZ0OiAycmVtOyB9XG4ubWQgLndpdGhTdGFydCB7IHBhZGRpbmctbGVmdDogMi4yNXJlbTsgfVxuLmxnIC53aXRoU3RhcnQgeyBwYWRkaW5nLWxlZnQ6IDIuNXJlbTsgfVxuXG4uc20gLndpdGhFbmQgeyBwYWRkaW5nLXJpZ2h0OiAycmVtOyB9XG4ubWQgLndpdGhFbmQgeyBwYWRkaW5nLXJpZ2h0OiAyLjI1cmVtOyB9XG4ubGcgLndpdGhFbmQgeyBwYWRkaW5nLXJpZ2h0OiAyLjVyZW07IH1cblxuLmhlbHBlclRleHQge1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXhzKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbn1cblxuLmVycm9yVGV4dCB7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBjb2xvcjogdmFyKC0tY29sb3ItZGFuZ2VyLTUwMCk7XG59XG4iXX0= */","import React from \"react\";\nimport styles from \"./Input.module.scss\";\n\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n label?: string;\n helperText?: string;\n errorText?: string;\n size?: InputSize;\n fullWidth?: boolean;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n label,\n helperText,\n errorText,\n size = \"md\",\n fullWidth = false,\n startAdornment,\n endAdornment,\n id,\n className,\n ...props\n },\n ref\n ) => {\n const inputId = id ?? (label ? label.toLowerCase().replace(/\\s+/g, \"-\") : undefined);\n const hasError = Boolean(errorText);\n\n return (\n <div\n className={[\n styles.wrapper,\n fullWidth ? styles.fullWidth : \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n )}\n <div className={[styles.inputWrapper, styles[size]].join(\" \")}>\n {startAdornment && (\n <span className={styles.adornment}>{startAdornment}</span>\n )}\n <input\n ref={ref}\n id={inputId}\n className={[\n styles.input,\n hasError ? styles.error : \"\",\n startAdornment ? styles.withStart : \"\",\n endAdornment ? styles.withEnd : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-invalid={hasError}\n aria-describedby={\n errorText\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined\n }\n {...props}\n />\n {endAdornment && (\n <span className={[styles.adornment, styles.adornmentEnd].join(\" \")}>\n {endAdornment}\n </span>\n )}\n </div>\n {errorText && (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {errorText}\n </span>\n )}\n {helperText && !errorText && (\n <span id={`${inputId}-helper`} className={styles.helperText}>\n {helperText}\n </span>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\n","@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.badge {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-1);\n font-family: var(--font-family-base);\n font-weight: 500;\n letter-spacing: 0.01em;\n border-radius: var(--radius-full);\n white-space: nowrap;\n}\n\n/* Sizes */\n.sm {\n font-size: var(--font-size-xs);\n padding: 0.1rem var(--spacing-2);\n}\n\n.md {\n font-size: var(--font-size-xs);\n padding: var(--spacing-1) var(--spacing-3);\n}\n\n/* Variants */\n.default {\n background-color: var(--color-neutral-100);\n color: var(--color-neutral-600);\n}\n\n.primary {\n background-color: var(--color-primary-50);\n color: var(--color-primary-700);\n}\n\n.success {\n background-color: #f0fdf4;\n color: var(--color-success-600);\n}\n\n.warning {\n background-color: #fffbeb;\n color: var(--color-warning-600);\n}\n\n.danger {\n background-color: #fef2f2;\n color: var(--color-danger-600);\n}\n\n/* Dot indicator */\n.dotIndicator {\n width: 0.5rem;\n height: 0.5rem;\n border-radius: var(--radius-full);\n background-color: currentColor;\n flex-shrink: 0;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIkJhZGdlLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ2pHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAaW1wb3J0IFwiLi4vLi4vc3R5bGVzL3Rva2Vucy5zY3NzXCI7XG5cbi5iYWRnZSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IHZhcigtLXNwYWNpbmctMSk7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4vKiBTaXplcyAqL1xuLnNtIHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBwYWRkaW5nOiAwLjFyZW0gdmFyKC0tc3BhY2luZy0yKTtcbn1cblxuLm1kIHtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTEpIHZhcigtLXNwYWNpbmctMyk7XG59XG5cbi8qIFZhcmlhbnRzICovXG4uZGVmYXVsdCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMTAwKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNjAwKTtcbn1cblxuLnByaW1hcnkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1wcmltYXJ5LTUwKTtcbiAgY29sb3I6IHZhcigtLWNvbG9yLXByaW1hcnktNzAwKTtcbn1cblxuLnN1Y2Nlc3Mge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmZGY0O1xuICBjb2xvcjogdmFyKC0tY29sb3Itc3VjY2Vzcy02MDApO1xufVxuXG4ud2FybmluZyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZWI7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci13YXJuaW5nLTYwMCk7XG59XG5cbi5kYW5nZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVmMmYyO1xuICBjb2xvcjogdmFyKC0tY29sb3ItZGFuZ2VyLTYwMCk7XG59XG5cbi8qIERvdCBpbmRpY2F0b3IgKi9cbi5kb3RJbmRpY2F0b3Ige1xuICB3aWR0aDogMC41cmVtO1xuICBoZWlnaHQ6IDAuNXJlbTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLWZ1bGwpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBjdXJyZW50Q29sb3I7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuIl19 */","import React from \"react\";\nimport styles from \"./Badge.module.scss\";\n\nexport type BadgeVariant = \"default\" | \"primary\" | \"success\" | \"warning\" | \"danger\";\nexport type BadgeSize = \"sm\" | \"md\";\n\nexport interface BadgeProps {\n variant?: BadgeVariant;\n size?: BadgeSize;\n dot?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const Badge: React.FC<BadgeProps> = ({\n variant = \"default\",\n size = \"md\",\n dot = false,\n children,\n className,\n}) => {\n return (\n <span\n className={[\n styles.badge,\n styles[variant],\n styles[size],\n dot ? styles.dot : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n >\n {dot && <span className={styles.dotIndicator} aria-hidden=\"true\" />}\n {children}\n </span>\n );\n};\n","@charset \"UTF-8\";\n.wrapper {\n position: relative;\n overflow: hidden;\n width: 100%;\n height: 100%;\n}\n\n/* Scie umide — sotto il contenuto */\n.trailCanvas {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n z-index: 1;\n pointer-events: none;\n}\n\n/* Form e contenuto — sopra le scie */\n.content {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Le gocce DOM stanno sopra tutto, ma pointer-events: none (impostato inline) */\n.dropContainer {\n position: absolute;\n inset: 0;\n z-index: 3;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJhaW5DYW52YXMubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0FBQ0E7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7QUFDQTtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7QUFDQTtFQUNFO0VBQ0E7RUFDQSIsInNvdXJjZXNDb250ZW50IjpbIi53cmFwcGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4vKiBTY2llIHVtaWRlIOKAlCBzb3R0byBpbCBjb250ZW51dG8gKi9cbi50cmFpbENhbnZhcyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB6LWluZGV4OiAxO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLyogRm9ybSBlIGNvbnRlbnV0byDigJQgc29wcmEgbGUgc2NpZSAqL1xuLmNvbnRlbnQge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICB6LWluZGV4OiAyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbn1cblxuLyogTGUgZ29jY2UgRE9NIHN0YW5ubyBzb3ByYSB0dXR0bywgbWEgcG9pbnRlci1ldmVudHM6IG5vbmUgKGltcG9zdGF0byBpbmxpbmUpICovXG4uZHJvcENvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgaW5zZXQ6IDA7XG4gIHotaW5kZXg6IDM7XG59XG4iXX0= */","import React, { useEffect, useRef } from \"react\";\nimport styles from \"./RainCanvas.module.scss\";\n\n// --- Tipi ---\n\ninterface Drop {\n id: number;\n kind: \"static\" | \"sliding\";\n x: number;\n y: number;\n radius: number;\n age: number;\n maxAge: number;\n speed: number;\n trail: { x: number; y: number }[];\n}\n\n// --- Helpers ---\n\nlet _nextId = 0;\n\nfunction randomBetween(a: number, b: number) {\n return a + Math.random() * (b - a);\n}\n\nfunction createStaticDrop(width: number, height: number): Drop {\n return {\n id: _nextId++,\n kind: \"static\",\n x: randomBetween(10, width - 10),\n y: randomBetween(10, height - 10),\n radius: randomBetween(4, 11),\n age: 0,\n maxAge: randomBetween(120, 400),\n speed: 0,\n trail: [],\n };\n}\n\n// --- Componente ---\n\nexport interface RainCanvasProps {\n dropCount?: number;\n background?: string;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const RainCanvas: React.FC<RainCanvasProps> = ({\n dropCount = 55,\n background = \"linear-gradient(160deg, #0f172a 0%, #1e3a5f 60%, #0f2a4a 100%)\",\n children,\n className,\n style,\n}) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const trailCanvasRef = useRef<HTMLCanvasElement>(null);\n const dropContainerRef = useRef<HTMLDivElement>(null);\n const dropsRef = useRef<Drop[]>([]);\n const nodeMapRef = useRef<Map<number, HTMLDivElement>>(new Map());\n const rafRef = useRef<number>(0);\n // Unique id per istanza per evitare conflitti se ci sono più RainCanvas nella pagina\n const filterIdRef = useRef(`rnf-${Math.random().toString(36).slice(2, 7)}`);\n\n useEffect(() => {\n const wrapper = wrapperRef.current;\n const trailCanvas = trailCanvasRef.current;\n const dropContainer = dropContainerRef.current;\n if (!wrapper || !trailCanvas || !dropContainer) return;\n\n const trailCtx = trailCanvas.getContext(\"2d\");\n if (!trailCtx) return;\n\n const filterId = filterIdRef.current;\n\n const resize = () => {\n const w = wrapper.offsetWidth;\n const h = wrapper.offsetHeight;\n trailCanvas.width = w;\n trailCanvas.height = h;\n dropsRef.current = Array.from({ length: dropCount }, () =>\n createStaticDrop(w, h)\n );\n };\n\n resize();\n const ro = new ResizeObserver(resize);\n ro.observe(wrapper);\n\n // Crea un nodo DOM per una goccia e lo aggiunge al container\n function getOrCreateNode(drop: Drop): HTMLDivElement {\n let node = nodeMapRef.current.get(drop.id);\n if (!node) {\n node = document.createElement(\"div\");\n // backdrop-filter: url(#id) applica il filtro SVG al contenuto DOM sottostante\n // Questo è ciò che crea la vera distorsione del contenuto reale\n node.style.cssText = `\n position: absolute;\n backdrop-filter: url(#${filterId}) brightness(1.12);\n -webkit-backdrop-filter: url(#${filterId}) brightness(1.12);\n box-shadow:\n inset 0 0 0 1px rgba(255,255,255,0.4),\n inset -2px -3px 6px rgba(255,255,255,0.18),\n inset 2px 2px 4px rgba(0, 40, 120, 0.15);\n background: radial-gradient(\n circle at 32% 30%,\n rgba(255,255,255,0.30) 0%,\n rgba(255,255,255,0.05) 45%,\n transparent 65%\n );\n pointer-events: none;\n will-change: transform;\n `;\n dropContainer!.appendChild(node);\n nodeMapRef.current.set(drop.id, node);\n }\n return node;\n }\n\n function removeNode(id: number) {\n const node = nodeMapRef.current.get(id);\n if (node) {\n node.remove();\n nodeMapRef.current.delete(id);\n }\n }\n\n function syncNode(drop: Drop) {\n const node = getOrCreateNode(drop);\n const isSliding = drop.kind === \"sliding\";\n const h = isSliding ? drop.radius * 2.4 : drop.radius * 2;\n const br = isSliding ? \"50% 50% 55% 55%\" : \"50%\";\n node.style.left = `${drop.x - drop.radius}px`;\n node.style.top = `${drop.y - drop.radius}px`;\n node.style.width = `${drop.radius * 2}px`;\n node.style.height = `${h}px`;\n node.style.borderRadius = br;\n }\n\n const tick = () => {\n const { width, height } = trailCanvas;\n\n // Fade della scia: riempiamo con un nero semi-trasparente ogni frame\n trailCtx.fillStyle = \"rgba(0,0,0,0.04)\";\n trailCtx.fillRect(0, 0, width, height);\n\n const next: Drop[] = [];\n\n for (const drop of dropsRef.current) {\n if (drop.kind === \"static\") {\n drop.age++;\n syncNode(drop);\n\n if (drop.age >= drop.maxAge) {\n // Diventa scorrevole: rimuovo il vecchio nodo e creo uno nuovo\n removeNode(drop.id);\n next.push({\n ...drop,\n id: _nextId++,\n kind: \"sliding\",\n speed: randomBetween(1.5, 3.5),\n trail: [],\n });\n } else {\n next.push(drop);\n }\n } else {\n // Aggiorna scia\n drop.trail.push({ x: drop.x, y: drop.y });\n if (drop.trail.length > 24) drop.trail.shift();\n\n // Disegna scia umida sul canvas\n if (drop.trail.length > 1) {\n trailCtx.beginPath();\n trailCtx.moveTo(drop.trail[0].x, drop.trail[0].y);\n for (let i = 1; i < drop.trail.length; i++) {\n trailCtx.lineTo(drop.trail[i].x, drop.trail[i].y);\n }\n trailCtx.strokeStyle = \"rgba(160, 200, 255, 0.18)\";\n trailCtx.lineWidth = drop.radius * 0.7;\n trailCtx.lineCap = \"round\";\n trailCtx.stroke();\n }\n\n drop.y += drop.speed;\n drop.speed += 0.06;\n syncNode(drop);\n\n if (drop.y - drop.radius > height) {\n removeNode(drop.id);\n next.push(createStaticDrop(width, height));\n } else {\n next.push(drop);\n }\n }\n }\n\n dropsRef.current = next;\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n\n return () => {\n cancelAnimationFrame(rafRef.current);\n ro.disconnect();\n // Pulizia nodi DOM\n nodeMapRef.current.forEach((node) => node.remove());\n nodeMapRef.current.clear();\n };\n }, [dropCount]);\n\n const filterId = filterIdRef.current;\n\n return (\n <div\n ref={wrapperRef}\n className={[styles.wrapper, className ?? \"\"].filter(Boolean).join(\" \")}\n style={{ background, ...style }}\n >\n {/*\n Definizione del filtro SVG:\n - feTurbulence genera rumore procedurale (pattern d'acqua)\n - feDisplacementMap usa quel rumore per spostare i pixel del backdrop\n L'animazione del seed fa \"muovere\" l'acqua nel tempo\n */}\n <svg width=\"0\" height=\"0\" style={{ position: \"absolute\" }}>\n <defs>\n <filter\n id={filterId}\n x=\"-20%\"\n y=\"-20%\"\n width=\"140%\"\n height=\"140%\"\n colorInterpolationFilters=\"sRGB\"\n >\n <feTurbulence\n type=\"turbulence\"\n baseFrequency=\"0.07 0.04\"\n numOctaves=\"2\"\n result=\"noise\"\n >\n <animate\n attributeName=\"seed\"\n values=\"1;20;1\"\n dur=\"5s\"\n repeatCount=\"indefinite\"\n />\n </feTurbulence>\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"noise\"\n scale=\"22\"\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </defs>\n </svg>\n\n {/* Canvas per le scie umide (z-index basso) */}\n <canvas ref={trailCanvasRef} className={styles.trailCanvas} />\n\n {/* Contenuto (form, ecc.) */}\n <div className={styles.content}>{children}</div>\n\n {/* Container delle gocce DOM — sopra il contenuto, pointer-events none */}\n <div ref={dropContainerRef} className={styles.dropContainer} />\n </div>\n );\n};\n","@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.timeline {\n list-style: none;\n margin: 0;\n padding: 0;\n font-family: var(--font-family-base);\n}\n\n.vertical {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.vertical .item {\n display: grid;\n grid-template-columns: 1.25rem 1fr;\n column-gap: 1rem;\n align-items: stretch;\n}\n.vertical .track {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 1.25rem;\n}\n.vertical .connector {\n flex: 1;\n width: 0;\n min-height: 0.5rem;\n border-left: 2px dashed var(--color-neutral-200);\n transition: border-color 0.3s ease;\n}\n.vertical .content {\n padding-bottom: 1.75rem;\n padding-top: 0.1rem;\n}\n.vertical .item.last .content {\n padding-bottom: 0;\n}\n\n.horizontal {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n}\n.horizontal .item {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n min-width: 0;\n}\n.horizontal .track {\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 100%;\n}\n.horizontal .connector {\n flex: 1;\n height: 0;\n min-width: 1rem;\n border-top: 2px dashed var(--color-neutral-200);\n transition: border-color 0.3s ease;\n}\n.horizontal .content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding-top: 0.75rem;\n padding-inline: 0.5rem;\n}\n\n.dot {\n width: 1.25rem;\n height: 1.25rem;\n border-radius: 50%;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.6rem;\n position: relative;\n z-index: 1;\n transition: background-color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;\n background-color: var(--color-neutral-0);\n border: 2px solid var(--color-neutral-200);\n color: var(--color-neutral-400);\n}\n\n.iconSlot {\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.65rem;\n line-height: 1;\n}\n\n.completed .dot {\n background-color: var(--timeline-accent-dot, var(--accent-dot));\n border-color: var(--timeline-accent-dot, var(--accent-dot));\n color: var(--color-neutral-0);\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n animation: dotIn 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275) both;\n animation-delay: var(--dot-delay, 0s);\n}\n\n.active .dot {\n background-color: var(--color-neutral-0);\n border-color: var(--timeline-accent-track, var(--accent-track));\n border-width: 2px;\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n animation: pulse 2s ease-in-out infinite;\n}\n\n.pending .dot {\n box-shadow: 0 0 0 3px var(--color-neutral-200);\n}\n\n.label {\n display: block;\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n margin-bottom: 0.2rem;\n letter-spacing: 0.01em;\n}\n\n.title {\n display: block;\n font-size: var(--font-size-sm);\n font-weight: 600;\n color: var(--color-neutral-900);\n letter-spacing: -0.01em;\n}\n\n.description {\n margin: 0.35rem 0 0;\n font-size: var(--font-size-xs);\n color: var(--color-neutral-600);\n line-height: 1.5;\n}\n\n.pending .title {\n color: var(--color-neutral-400);\n font-weight: 500;\n}\n\n.connectorHidden {\n border-color: transparent !important;\n}\n\n.connectorDone {\n border-color: var(--timeline-accent-track, var(--accent-track)) !important;\n border-style: solid !important;\n}\n\n@keyframes dotIn {\n 0% {\n transform: scale(0.5);\n background-color: var(--color-neutral-0);\n border-color: var(--color-neutral-200);\n box-shadow: 0 0 0 3px var(--color-neutral-200);\n color: transparent;\n }\n 40% {\n background-color: var(--timeline-accent-dot, var(--accent-dot));\n border-color: var(--timeline-accent-dot, var(--accent-dot));\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n color: var(--color-neutral-0);\n }\n 50% {\n transform: scale(1.06);\n }\n 70% {\n transform: scale(0.97);\n }\n 85% {\n transform: scale(1.02);\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes pulse {\n 0%, 100% {\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring));\n }\n 50% {\n box-shadow: 0 0 0 3px var(--timeline-accent-ring, var(--accent-ring)), 0 0 0 6px var(--timeline-accent-glow, var(--accent-glow));\n }\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlRpbWVsaW5lLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ3JGRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFNRjtFQUNFO0VBQ0E7RUFDQTs7QUFFQTtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0EsT0FwQ087O0FBdUNUO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBT0o7RUFDRTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPSjtFQUNFLE9BekdTO0VBMEdULFFBMUdTO0VBMkdUO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFPQTtFQUNFLGtCQXBJVztFQXFJWCxjQXJJVztFQXNJWDtFQUNBO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRTtFQUNBLGNBL0lXO0VBZ0pYO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRTs7O0FBT0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTs7O0FBSUY7RUFDRTs7O0FBSUY7RUFDRTtFQUNBOzs7QUFNRjtFQUNFO0lBQ0U7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7RUFFRjtJQUNFLGtCQXBOVztJQXFOWCxjQXJOVztJQXNOWDtJQUNBOztFQUVGO0lBQU87O0VBQ1A7SUFBTzs7RUFDUDtJQUFPOztFQUNQO0lBQU87OztBQUdUO0VBQ0U7SUFBVzs7RUFDWDtJQUFZIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAdXNlIFwiLi4vLi4vc3R5bGVzL3Rva2Vuc1wiIGFzICo7XG5cbi8vIC0tLSBUb2tlbnMgbG9jYWxpIC0tLVxuLy8gVXNhIC0tdGltZWxpbmUtYWNjZW50LSogc2UgcGFzc2F0byB2aWEgcHJvcCwgYWx0cmltZW50aSBmYWxsYmFjayBhaSB0b2tlbiBnbG9iYWxpXG4kZG90LXNpemU6IDEuMjVyZW07XG4kY29ubmVjdG9yLXRoaWNrbmVzczogMnB4O1xuJGNvbG9yLXBlbmRpbmc6IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcblxuJGFjY2VudC1kb3Q6ICAgdmFyKC0tdGltZWxpbmUtYWNjZW50LWRvdCwgICB2YXIoLS1hY2NlbnQtZG90KSk7XG4kYWNjZW50LXRyYWNrOiB2YXIoLS10aW1lbGluZS1hY2NlbnQtdHJhY2ssIHZhcigtLWFjY2VudC10cmFjaykpO1xuJGFjY2VudC1yaW5nOiAgdmFyKC0tdGltZWxpbmUtYWNjZW50LXJpbmcsICB2YXIoLS1hY2NlbnQtcmluZykpO1xuJGFjY2VudC1nbG93OiAgdmFyKC0tdGltZWxpbmUtYWNjZW50LWdsb3csICB2YXIoLS1hY2NlbnQtZ2xvdykpO1xuXG4vLyAtLS0gUmVzZXQgbGlzdGEgLS0tXG4udGltZWxpbmUge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LWZhbWlseS1iYXNlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09XG4vLyBWRVJUSUNBTEUgKGRlZmF1bHQpXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbi52ZXJ0aWNhbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogMDtcblxuICAuaXRlbSB7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6ICRkb3Qtc2l6ZSAxZnI7XG4gICAgY29sdW1uLWdhcDogMXJlbTtcbiAgICBhbGlnbi1pdGVtczogc3RyZXRjaDtcbiAgfVxuXG4gIC50cmFjayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6ICRkb3Qtc2l6ZTtcbiAgfVxuXG4gIC5jb25uZWN0b3Ige1xuICAgIGZsZXg6IDE7XG4gICAgd2lkdGg6IDA7XG4gICAgbWluLWhlaWdodDogMC41cmVtO1xuICAgIGJvcmRlci1sZWZ0OiAkY29ubmVjdG9yLXRoaWNrbmVzcyBkYXNoZWQgJGNvbG9yLXBlbmRpbmc7XG4gICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3MgZWFzZTtcbiAgfVxuXG4gIC5jb250ZW50IHtcbiAgICBwYWRkaW5nLWJvdHRvbTogMS43NXJlbTtcbiAgICBwYWRkaW5nLXRvcDogMC4xcmVtO1xuICB9XG5cbiAgLml0ZW0ubGFzdCAuY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE9SSVpaT05UQUxFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PVxuLmhvcml6b250YWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxuICAuaXRlbSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogMTtcbiAgICBtaW4td2lkdGg6IDA7XG5cbiAgfVxuXG4gIC50cmFjayB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAuY29ubmVjdG9yIHtcbiAgICBmbGV4OiAxO1xuICAgIGhlaWdodDogMDtcbiAgICBtaW4td2lkdGg6IDFyZW07XG4gICAgYm9yZGVyLXRvcDogJGNvbm5lY3Rvci10aGlja25lc3MgZGFzaGVkICRjb2xvci1wZW5kaW5nO1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjNzIGVhc2U7XG4gIH1cblxuXG5cbiAgLmNvbnRlbnQge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nLXRvcDogMC43NXJlbTtcbiAgICBwYWRkaW5nLWlubGluZTogMC41cmVtO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9UXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbi5kb3Qge1xuICB3aWR0aDogJGRvdC1zaXplO1xuICBoZWlnaHQ6ICRkb3Qtc2l6ZTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBmbGV4LXNocmluazogMDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMC42cmVtO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4ycyBlYXNlLCBib3JkZXItY29sb3IgMC4ycyBlYXNlLCBib3gtc2hhZG93IDAuMnMgZWFzZTtcblxuICAvLyBwZW5kaW5nXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMCk7XG4gIGJvcmRlcjogJGNvbm5lY3Rvci10aGlja25lc3Mgc29saWQgJGNvbG9yLXBlbmRpbmc7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG59XG5cbi5pY29uU2xvdCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBmb250LXNpemU6IDAuNjVyZW07XG4gIGxpbmUtaGVpZ2h0OiAxO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbi8vIFNUQVRVU1xuLy8gPT09PT09PT09PT09PT09PT09PT09XG4uY29tcGxldGVkIHtcbiAgLmRvdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGFjY2VudC1kb3Q7XG4gICAgYm9yZGVyLWNvbG9yOiAkYWNjZW50LWRvdDtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC0wKTtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJGFjY2VudC1yaW5nO1xuICAgIGFuaW1hdGlvbjogZG90SW4gMC40cyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSkgYm90aDtcbiAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLWRvdC1kZWxheSwgMHMpO1xuICB9XG59XG5cbi5hY3RpdmUge1xuICAuZG90IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTApO1xuICAgIGJvcmRlci1jb2xvcjogJGFjY2VudC10cmFjaztcbiAgICBib3JkZXItd2lkdGg6IDJweDtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggJGFjY2VudC1yaW5nO1xuICAgIGFuaW1hdGlvbjogcHVsc2UgMnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gIH1cbn1cblxuLnBlbmRpbmcge1xuICAuZG90IHtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggdmFyKC0tY29sb3ItbmV1dHJhbC0yMDApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09OVEVOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09XG4ubGFiZWwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC00MDApO1xuICBtYXJnaW4tYm90dG9tOiAwLjJyZW07XG4gIGxldHRlci1zcGFjaW5nOiAwLjAxZW07XG59XG5cbi50aXRsZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS1zbSk7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTkwMCk7XG4gIGxldHRlci1zcGFjaW5nOiAtMC4wMWVtO1xufVxuXG4uZGVzY3JpcHRpb24ge1xuICBtYXJnaW46IDAuMzVyZW0gMCAwO1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS14cyk7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTYwMCk7XG4gIGxpbmUtaGVpZ2h0OiAxLjU7XG59XG5cbi8vIFN0YXR1czogdGl0b2xvIHBpw7kgc2JpYWRpdG8gcGVyIHBlbmRpbmdcbi5wZW5kaW5nIC50aXRsZSB7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi8vIENvbm5ldHRvcmUgaW52aXNpYmlsZSDigJQgdGllbmUgbG8gc3BhemlvIG1hIG5vbiBtb3N0cmEgbGEgbGluZWFcbi5jb25uZWN0b3JIaWRkZW4ge1xuICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG59XG5cbi8vIENvbm5ldHRvcmUgY29tcGxldGF0byDigJQgc292cmFzY3JpdmUgZGFzaGVkIGNvbiBzb2xpZCArIGNvbG9yZSBhY2NlbnRcbi5jb25uZWN0b3JEb25lIHtcbiAgYm9yZGVyLWNvbG9yOiAkYWNjZW50LXRyYWNrICFpbXBvcnRhbnQ7XG4gIGJvcmRlci1zdHlsZTogc29saWQgIWltcG9ydGFudDtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09XG4vLyBBTklNQVpJT05JXG4vLyA9PT09PT09PT09PT09PT09PT09PT1cbkBrZXlmcmFtZXMgZG90SW4ge1xuICAwJSB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMCk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgNDAlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYWNjZW50LWRvdDtcbiAgICBib3JkZXItY29sb3I6ICRhY2NlbnQtZG90O1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCAkYWNjZW50LXJpbmc7XG4gICAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtMCk7XG4gIH1cbiAgNTAlICB7IHRyYW5zZm9ybTogc2NhbGUoMS4wNik7IH1cbiAgNzAlICB7IHRyYW5zZm9ybTogc2NhbGUoMC45Nyk7IH1cbiAgODUlICB7IHRyYW5zZm9ybTogc2NhbGUoMS4wMik7IH1cbiAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSk7IH1cbn1cblxuQGtleWZyYW1lcyBwdWxzZSB7XG4gIDAlLCAxMDAlIHsgYm94LXNoYWRvdzogMCAwIDAgM3B4ICRhY2NlbnQtcmluZzsgfVxuICA1MCUgICAgICAgeyBib3gtc2hhZG93OiAwIDAgMCAzcHggJGFjY2VudC1yaW5nLCAwIDAgMCA2cHggJGFjY2VudC1nbG93OyB9XG59XG4iXX0= */","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 from \"react\";\nimport styles from \"./Timeline.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport type TimelineStatus = \"completed\" | \"active\" | \"pending\";\nexport type TimelineOrientation = \"vertical\" | \"horizontal\";\n\nexport interface TimelineItem {\n id: string | number;\n title: string;\n description?: string;\n label?: string;\n status?: TimelineStatus;\n icon?: React.ReactNode;\n}\n\nexport interface TimelineProps {\n items: TimelineItem[];\n orientation?: TimelineOrientation;\n /** Colore accent custom — sovrascrive il tema globale per questa istanza */\n accent?: string;\n className?: string;\n}\n\nconst CheckIcon = () => (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path\n d=\"M1.5 5L4 7.5L8.5 2.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n orientation = \"vertical\",\n accent,\n className,\n}) => {\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"timeline\")\n : {};\n\n return (\n <ol\n className={[\n styles.timeline,\n styles[orientation],\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \")}\n style={accentVars as React.CSSProperties}\n >\n {items.map((item, index) => {\n const status = item.status ?? \"pending\";\n const isLast = index === items.length - 1;\n\n return (\n <li\n key={item.id}\n className={[styles.item, styles[status], isLast ? styles.last : \"\"]\n .filter(Boolean)\n .join(\" \")}\n style={{ \"--dot-delay\": `${index * 0.08}s` } as React.CSSProperties}\n >\n {/* Colonna sinistra (verticale) o riga superiore (orizzontale): dot + connettore */}\n <div className={styles.track}>\n {/* Connettore sinistro — orizzontale: sempre, invisibile sul primo */}\n {orientation === \"horizontal\" && (\n <div className={[\n styles.connector,\n index === 0 ? styles.connectorHidden : \"\",\n index > 0 && items[index - 1].status === \"completed\" ? styles.connectorDone : \"\",\n ].filter(Boolean).join(\" \")} />\n )}\n\n <div className={styles.dot}>\n {status === \"completed\" && (\n item.icon\n ? <span className={styles.iconSlot}>{item.icon}</span>\n : <CheckIcon />\n )}\n </div>\n\n {/* Connettore destro — verticale: non sull'ultimo; orizzontale: sempre, invisibile sull'ultimo */}\n {(orientation === \"horizontal\" || !isLast) && (\n <div className={[\n styles.connector,\n orientation === \"horizontal\" && isLast ? styles.connectorHidden : \"\",\n status === \"completed\" ? styles.connectorDone : \"\",\n ].filter(Boolean).join(\" \")} />\n )}\n </div>\n\n {/* Contenuto */}\n <div className={styles.content}>\n {item.label && (\n <span className={styles.label}>{item.label}</span>\n )}\n <span className={styles.title}>{item.title}</span>\n {item.description && (\n <p className={styles.description}>{item.description}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n","@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.colorPicker[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 --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.colorPicker {\n display: inline-flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n background: var(--color-surface);\n backdrop-filter: blur(16px);\n -webkit-backdrop-filter: blur(16px);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md), 0 0 0 1px rgba(0, 0, 0, 0.04);\n font-family: var(--font-family-base);\n width: calc(200px + 2rem);\n box-sizing: border-box;\n user-select: none;\n}\n\n.topRow {\n display: flex;\n justify-content: center;\n}\n\n.discWrapper {\n position: relative;\n width: 200px;\n height: 200px;\n flex-shrink: 0;\n border-radius: 50%;\n box-shadow: 0 0 0 1.5px var(--color-neutral-200);\n}\n\n.disc {\n display: block;\n width: 200px;\n height: 200px;\n cursor: crosshair;\n border-radius: 50%;\n}\n\n.dot {\n position: absolute;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 1.5px rgba(0, 0, 0, 0.2), 0 2px 4px rgba(0, 0, 0, 0.2);\n background: transparent;\n}\n\n.previewSwatch {\n width: 100%;\n height: 48px;\n border-radius: var(--radius-md);\n border: 1px solid rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);\n position: relative;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 0 0.5rem;\n box-sizing: border-box;\n}\n\n.eyedropperBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--radius-sm);\n background: rgba(255, 255, 255, 0.15);\n cursor: pointer;\n backdrop-filter: blur(4px);\n transition: background var(--transition-fast);\n}\n.eyedropperBtn:hover {\n background: rgba(255, 255, 255, 0.4);\n}\n\n.inputSection {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.tabs {\n display: flex;\n background: var(--color-neutral-100);\n border-radius: var(--radius-sm);\n padding: 2px;\n gap: 2px;\n}\n\n.tab {\n flex: 1;\n padding: 0.2rem 0;\n font-size: 0.65rem;\n font-weight: 600;\n letter-spacing: 0.04em;\n border: none;\n border-radius: calc(var(--radius-sm) - 1px);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n}\n.tab:hover:not(.tabActive) {\n color: var(--color-neutral-600);\n}\n\n.tabActive {\n background: var(--colorpicker-accent, var(--accent));\n color: #fff;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n.inputWrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.inputAddon {\n position: absolute;\n left: 0.5rem;\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-400);\n pointer-events: none;\n line-height: 1;\n}\n\n.input {\n width: 100%;\n box-sizing: border-box;\n padding: 0.4rem 2rem;\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-sm);\n font-size: var(--font-size-xs);\n font-family: \"SF Mono\", \"Fira Code\", \"Consolas\", monospace;\n color: var(--color-neutral-900);\n background: var(--color-neutral-0);\n outline: none;\n text-align: center;\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n.input:focus {\n border-color: var(--colorpicker-accent, var(--accent));\n box-shadow: 0 0 0 2px var(--colorpicker-accent-glow, var(--accent-glow));\n}\n\n.inputCopyBtn {\n position: absolute;\n right: 0.35rem;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-400);\n cursor: pointer;\n transition: background var(--transition-fast), color var(--transition-fast);\n}\n.inputCopyBtn:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.recents {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding-top: 0.25rem;\n border-top: 1px solid var(--color-neutral-100);\n overflow: hidden;\n}\n\n.recentsLabel {\n font-size: 0.6rem;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-neutral-400);\n flex-shrink: 0;\n}\n\n.swatches {\n display: flex;\n gap: 0.35rem;\n flex-wrap: nowrap;\n overflow: hidden;\n}\n\n.recentSwatch {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 1.5px solid rgba(0, 0, 0, 0.1);\n cursor: pointer;\n padding: 0;\n flex-shrink: 0;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIkNvbG9yUGlja2VyLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ3BGRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBS0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFLRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQSxPQWhESztFQWlETCxRQWpESztFQWtETDtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQSxPQXpESztFQTBETCxRQTFESztFQTJETDtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBTUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTs7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7OztBQUlKO0VBQ0UsWUF0SmE7RUF1SmI7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0UsY0ExTFc7RUEyTFg7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBOzs7QUFPSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlIFwic2Fzczpjb2xvclwiO1xuXG5AaW1wb3J0IHVybChcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXBcIik7XG5cbi8vIEFjY2VudCBkaSBkZWZhdWx0IOKAlCBjYW1iaWEgcXVpIHBlciBhZ2dpb3JuYXJlIHR1dHRhIGxhIGxpYnJlcmlhXG4kYWNjZW50OiAjM2I4MmY2O1xuXG46cm9vdCB7XG4gIC8vIEFjY2VudCBzY2FsZSDigJQgZGVyaXZhdGEgZGEgJGFjY2VudCBhIGNvbXBpbGUgdGltZVxuICAtLWFjY2VudDogICAgICAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWRvdDogICAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAxMiUpfTtcbiAgLS1hY2NlbnQtdHJhY2s6ICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1yaW5nOiAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWdsb3c6ICAgI3tjb2xvci5jaGFuZ2UoJGFjY2VudCwgJGFscGhhOiAwLjMpfTtcbiAgLS1hY2NlbnQtbGlnaHQ6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ1JSwgJHNhdHVyYXRpb246IC0yMCUpfTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIChtYW50ZW51dGEgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AgY29uIEJ1dHRvbiwgQmFkZ2UsIElucHV0KVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ5JSwgJHNhdHVyYXRpb246IC0zMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTEwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0MiUsICRzYXR1cmF0aW9uOiAtMTUlKX07XG4gIC0tY29sb3ItcHJpbWFyeS00MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tY29sb3ItcHJpbWFyeS01MDA6ICN7JGFjY2VudH07XG4gIC0tY29sb3ItcHJpbWFyeS02MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogLTEwJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNzAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0yMCUpfTtcblxuICAvLyBOZXV0cmFsXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICNmZmZmZmY7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICNmM2Y0ZjY7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICNlNWU3ZWI7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5Y2EzYWY7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICM0YjU1NjM7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICMxMTE4Mjc7XG5cbiAgLy8gU2VtYW50aWNcbiAgLS1jb2xvci1zdWNjZXNzLTUwMDogIzIyYzU1ZTtcbiAgLS1jb2xvci1zdWNjZXNzLTYwMDogIzE2YTM0YTtcbiAgLS1jb2xvci1kYW5nZXItNTAwOiAgI2VmNDQ0NDtcbiAgLS1jb2xvci1kYW5nZXItNjAwOiAgI2RjMjYyNjtcbiAgLS1jb2xvci13YXJuaW5nLTUwMDogI2Y1OWUwYjtcbiAgLS1jb2xvci13YXJuaW5nLTYwMDogI2Q5NzcwNjtcblxuICAvLyBUeXBvZ3JhcGh5XG4gIC0tZm9udC1mYW1pbHktYmFzZTogXCJJbnRlclwiLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWY7XG4gIC0tZm9udC1zaXplLXhzOiAwLjc1cmVtO1xuICAtLWZvbnQtc2l6ZS1zbTogMC44NzVyZW07XG4gIC0tZm9udC1zaXplLW1kOiAxcmVtO1xuICAtLWZvbnQtc2l6ZS1sZzogMS4xMjVyZW07XG5cbiAgLy8gU3BhY2luZ1xuICAtLXNwYWNpbmctMTogMC4yNXJlbTtcbiAgLS1zcGFjaW5nLTI6IDAuNXJlbTtcbiAgLS1zcGFjaW5nLTM6IDAuNzVyZW07XG4gIC0tc3BhY2luZy00OiAxcmVtO1xuXG4gIC8vIFJhZGl1c1xuICAtLXJhZGl1cy1zbTogICAwLjI1cmVtO1xuICAtLXJhZGl1cy1tZDogICAwLjM3NXJlbTtcbiAgLS1yYWRpdXMtbGc6ICAgMC41cmVtO1xuICAtLXJhZGl1cy1mdWxsOiA5OTk5cHg7XG5cbiAgLy8gU2hhZG93c1xuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7XG4gIC0tc2hhZG93LW1kOiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuXG4gIC8vIFRyYW5zaXRpb25zXG4gIC0tdHJhbnNpdGlvbi1mYXN0OiAxNTBtcyBlYXNlO1xuXG4gIC8vIFN1cmZhY2UgKGJhY2tncm91bmQgZGkgY2FyZC9wYW5lbClcbiAgLS1jb2xvci1zdXJmYWNlOiAgICAgICAgICAjZmZmZmZmO1xuICAtLWNvbG9yLXN1cmZhY2UtZWxldmF0ZWQ6ICNmZmZmZmY7XG59XG5cbi8vIOKUgOKUgOKUgCBEYXJrIHRoZW1lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXBwbGljYXRvIHZpYSBkYXRhLXRoZW1lPVwiZGFya1wiIHN1bGwnZWxlbWVudG8gcm9vdCAoZ2VzdGl0byBkYSBTdG9yeWJvb2sgZGVjb3JhdG9yXG4vLyBlIGRhbGwnYXBwIGNvbnN1bWVyKS4gSSBjb21wb25lbnRpIG5vbiBkZXZvbm8gZmFyZSBudWxsYSBkaSBzcGVjaWFsZTogYmFzdGEgY2hlXG4vLyB1c2lubyBpIHRva2VuIHZhcigpIGUgcmljZXZlcmFubm8gYXV0b21hdGljYW1lbnRlIGkgdmFsb3JpIGRhcmsuXG5cbltkYXRhLXRoZW1lPVwiZGFya1wiXSB7XG4gIC8vIE5ldXRyYWwgKHNjYWxhIGludmVydGl0YSlcbiAgLS1jb2xvci1uZXV0cmFsLTA6ICAgIzBmMTcyYTtcbiAgLS1jb2xvci1uZXV0cmFsLTEwMDogIzFlMjkzYjtcbiAgLS1jb2xvci1uZXV0cmFsLTIwMDogIzMzNDE1NTtcbiAgLS1jb2xvci1uZXV0cmFsLTQwMDogIzk0YTNiODtcbiAgLS1jb2xvci1uZXV0cmFsLTYwMDogI2NiZDVlMTtcbiAgLS1jb2xvci1uZXV0cmFsLTkwMDogI2Y4ZmFmYztcblxuICAvLyBTdXJmYWNlXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgIzFlMjkzYjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjMjczNTQ5O1xuXG4gIC8vIFByaW1hcnkgc2NhbGUgZGFyayAocGVyIGlsIGRlZmF1bHQgYWNjZW50IGJsdSDigJQgbGUgc2Z1bWF0dXJlIGNoaWFyZSBkaXZlbnRhbm8gc2N1cmUpXG4gIC0tY29sb3ItcHJpbWFyeS01MDogICMxNzI1NTQ7XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICMxZTNhOGE7XG4gIC8vIDQwMCAvIDUwMCAvIDYwMCAvIDcwMCByaW1hbmdvbm8gaW52YXJpYXRpIChhYmJhc3RhbnphIHNhdHVyaSBzdSBiZyBzY3VybylcblxuICAvLyBBY2NlbnQgbGlnaHQ6IHZhcmlhbnRlIHNjdXJhXG4gIC0tYWNjZW50LWxpZ2h0OiAjMTcyNTU0O1xuXG4gIC8vIFNoYWRvd3MgKHBpw7kgZm9ydGkgc3UgYmcgc2N1cm8pXG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjQpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC41KSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC40KTtcbn1cbiIsIkB1c2UgXCIuLi8uLi9zdHlsZXMvdG9rZW5zXCIgYXMgKjtcblxuJGFjY2VudC1iYXNlOiAgdmFyKC0tY29sb3JwaWNrZXItYWNjZW50LCAgICAgICB2YXIoLS1hY2NlbnQpKTtcbiRhY2NlbnQtcmluZzogIHZhcigtLWNvbG9ycGlja2VyLWFjY2VudC1yaW5nLCAgdmFyKC0tYWNjZW50LXJpbmcpKTtcbiRhY2NlbnQtZ2xvdzogIHZhcigtLWNvbG9ycGlja2VyLWFjY2VudC1nbG93LCAgdmFyKC0tYWNjZW50LWdsb3cpKTtcbiRhY2NlbnQtbGlnaHQ6IHZhcigtLWNvbG9ycGlja2VyLWFjY2VudC1saWdodCwgdmFyKC0tYWNjZW50LWxpZ2h0KSk7XG5cbiRkaXNjOiAyMDBweDtcbiRzbGlkZXItdzogMjBweDtcbiR0aHVtYi1zaXplOiAyMHB4O1xuJGdhcDogMC41cmVtO1xuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSBzY29wZWQgc3VsbCdlbGVtZW50byAocHJvcCB0aGVtZT1cImRhcmtcIikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTb3ZyYXNjcml2ZSBpIHRva2VuIGdsb2JhbGkgbG9jYWxtZW50ZSDigJQgbm9uIGRpcGVuZGUgZGFsIGRhdGEtdGhlbWUgZGVsbCdhcHAuXG5cbi5jb2xvclBpY2tlcltkYXRhLXRoZW1lPVwiZGFya1wiXSB7XG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG4gIC0tY29sb3Itc3VyZmFjZTogICAgICMxZTI5M2I7XG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjQpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC41KSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC40KTtcbn1cblxuLy8g4pSA4pSA4pSAIENhcmQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5jb2xvclBpY2tlciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDAuNzVyZW07XG4gIHBhZGRpbmc6IDFyZW07XG4gIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLXN1cmZhY2UpO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTZweCk7XG4gIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDE2cHgpO1xuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1sZyk7XG4gIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy1tZCksIDAgMCAwIDFweCByZ2JhKDAsMCwwLDAuMDQpO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIHdpZHRoOiBjYWxjKCN7JGRpc2N9ICsgMnJlbSk7IC8vIGRpc2MgKyBjYXJkIHBhZGRpbmcgKDFyZW0gw5cgMiBzaWRlcylcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi8vIOKUgOKUgOKUgCBEaXNjICsgTCBzbGlkZXIgcm93IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4udG9wUm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5kaXNjV3JhcHBlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6ICRkaXNjO1xuICBoZWlnaHQ6ICRkaXNjO1xuICBmbGV4LXNocmluazogMDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3gtc2hhZG93OiAwIDAgMCAxLjVweCB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCk7XG59XG5cbi5kaXNjIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAkZGlzYztcbiAgaGVpZ2h0OiAkZGlzYztcbiAgY3Vyc29yOiBjcm9zc2hhaXI7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbn1cblxuLmRvdCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDE0cHg7XG4gIGhlaWdodDogMTRweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDJweCBzb2xpZDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBib3gtc2hhZG93OiAwIDAgMCAxLjVweCByZ2JhKDAsIDAsIDAsIDAuMiksIDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xufVxuXG5cbi8vIOKUgOKUgOKUgCBQcmV2aWV3IHN3YXRjaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLnByZXZpZXdTd2F0Y2gge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA0OHB4O1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbWQpO1xuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbiAgcGFkZGluZzogMCAwLjVyZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5leWVkcm9wcGVyQnRuIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAyOHB4O1xuICBoZWlnaHQ6IDI4cHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS10cmFuc2l0aW9uLWZhc3QpO1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgSW5wdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4uaW5wdXRTZWN0aW9uIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAwLjVyZW07XG59XG5cbi50YWJzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3ItbmV1dHJhbC0xMDApO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pO1xuICBwYWRkaW5nOiAycHg7XG4gIGdhcDogMnB4O1xufVxuXG4udGFiIHtcbiAgZmxleDogMTtcbiAgcGFkZGluZzogMC4ycmVtIDA7XG4gIGZvbnQtc2l6ZTogMC42NXJlbTtcbiAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiBjYWxjKHZhcigtLXJhZGl1cy1zbSkgLSAxcHgpO1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIHZhcigtLXRyYW5zaXRpb24tZmFzdCksIGNvbG9yIHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG5cbiAgJjpob3Zlcjpub3QoLnRhYkFjdGl2ZSkge1xuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTYwMCk7XG4gIH1cbn1cblxuLnRhYkFjdGl2ZSB7XG4gIGJhY2tncm91bmQ6ICRhY2NlbnQtYmFzZTtcbiAgY29sb3I6ICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4uaW5wdXRXcmFwcGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uaW5wdXRBZGRvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogMC41cmVtO1xuICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS14cyk7XG4gIGZvbnQtZmFtaWx5OiBcIlNGIE1vbm9cIiwgXCJGaXJhIENvZGVcIiwgXCJDb25zb2xhc1wiLCBtb25vc3BhY2U7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBsaW5lLWhlaWdodDogMTtcbn1cblxuLmlucHV0IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDAuNHJlbSAycmVtOyAvLyBzeW1tZXRyaWM6IHJvb20gZm9yICMgb24gbGVmdCBhbmQgY29weSBpY29uIG9uIHJpZ2h0XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTtcbiAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUteHMpO1xuICBmb250LWZhbWlseTogXCJTRiBNb25vXCIsIFwiRmlyYSBDb2RlXCIsIFwiQ29uc29sYXNcIiwgbW9ub3NwYWNlO1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1uZXV0cmFsLTApO1xuICBvdXRsaW5lOiBub25lO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS10cmFuc2l0aW9uLWZhc3QpLCBib3gtc2hhZG93IHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG5cbiAgJjpmb2N1cyB7XG4gICAgYm9yZGVyLWNvbG9yOiAkYWNjZW50LWJhc2U7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMnB4ICRhY2NlbnQtZ2xvdztcbiAgfVxufVxuXG4uaW5wdXRDb3B5QnRuIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMC4zNXJlbTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIHdpZHRoOiAyMnB4O1xuICBoZWlnaHQ6IDIycHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCB2YXIoLS10cmFuc2l0aW9uLWZhc3QpLCBjb2xvciB2YXIoLS10cmFuc2l0aW9uLWZhc3QpO1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW5ldXRyYWwtMTAwKTtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICB9XG59XG5cblxuLy8g4pSA4pSA4pSAIFJlY2VudCBjb2xvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5yZWNlbnRzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVyZW07XG4gIHBhZGRpbmctdG9wOiAwLjI1cmVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tY29sb3ItbmV1dHJhbC0xMDApO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVjZW50c0xhYmVsIHtcbiAgZm9udC1zaXplOiAwLjZyZW07XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4uc3dhdGNoZXMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBnYXA6IDAuMzVyZW07XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucmVjZW50U3dhdGNoIHtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDEuNXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAwO1xuICBmbGV4LXNocmluazogMDtcbn1cbiJdfQ== */","@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 */","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","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport styles from \"./ColorPicker.module.scss\";\nimport { SliderControl } from \"../SliderControl\";\nimport {\n accentToCssVars,\n buildColorValue,\n deriveAccent,\n hexToHsl,\n hslToHex,\n hslToRgb,\n rgbToHsl,\n} from \"../../utils/color\";\nimport type { ColorValue } from \"../../utils/color\";\n\ndeclare global {\n interface Window {\n EyeDropper?: new () => { open(): Promise<{ sRGBHex: string }> };\n }\n}\n\nconst DISC = 200;\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nconst CopyIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"5\" y=\"5\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path d=\"M2 9V2.5A.5.5 0 0 1 2.5 2H9\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M2.5 7L5.5 10L11.5 4\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n);\n\nconst EyedropperIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.5 2.5L11.5 4.5L6 10L3 11L4 8L9.5 2.5Z\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\" />\n <path d=\"M8 4L10 6\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <circle cx=\"2.5\" cy=\"11.5\" r=\"1\" fill=\"currentColor\" />\n </svg>\n);\n\n// ─── Input sub-component ──────────────────────────────────────────────────────\n\ntype InputMode = \"hex\" | \"hsl\" | \"rgb\";\n\ninterface ColorInputProps {\n mode: InputMode;\n h: number; s: number; l: number;\n r: number; g: number; b: number;\n hex: string;\n onChange: (h: number, s: number, l: number) => void;\n onCopy: () => void;\n copied: boolean;\n}\n\nfunction formatValue(mode: InputMode, h: number, s: number, l: number, r: number, g: number, b: number, hex: string): string {\n if (mode === \"hex\") return hex.replace(\"#\", \"\");\n if (mode === \"hsl\") return `${Math.round(h)} ${Math.round(s)} ${Math.round(l)}`;\n return `${r} ${g} ${b}`;\n}\n\nfunction parseValue(mode: InputMode, raw: string): [number, number, number] | null {\n if (mode === \"hex\") {\n const clean = raw.replace(/^#/, \"\");\n if (!/^[0-9a-fA-F]{6}$/.test(clean)) return null;\n const [h, s, l] = hexToHsl(`#${clean}`);\n return [h, s, l];\n }\n const parts = raw.trim().split(/[\\s,]+/).map(Number);\n if (parts.length !== 3 || parts.some(isNaN)) return null;\n if (mode === \"hsl\") {\n const [h, s, l] = parts;\n if (h < 0 || h > 360 || s < 0 || s > 100 || l < 0 || l > 100) return null;\n return [h, s, l];\n }\n // rgb\n const [r, g, b] = parts;\n if ([r, g, b].some((v) => v < 0 || v > 255)) return null;\n return rgbToHsl(r, g, b);\n}\n\nconst ColorInput: React.FC<ColorInputProps> = ({ mode, h, s, l, r, g, b, hex, onChange, onCopy, copied }) => {\n const [draft, setDraft] = useState(() => formatValue(mode, h, s, l, r, g, b, hex));\n const [focused, setFocused] = useState(false);\n\n // sync from outside only when not focused\n useEffect(() => {\n if (!focused) setDraft(formatValue(mode, h, s, l, r, g, b, hex));\n }, [focused, mode, h, s, l, r, g, b, hex]);\n\n const placeholder = mode === \"hex\" ? \"3b82f6\" : mode === \"hsl\" ? \"217 91 60\" : \"59 130 246\";\n\n return (\n <div className={styles.inputWrapper}>\n {mode === \"hex\" && <span className={styles.inputAddon}>#</span>}\n <input\n className={styles.input}\n value={draft}\n placeholder={placeholder}\n spellCheck={false}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n onChange={(e) => {\n const raw = e.target.value;\n setDraft(raw);\n const result = parseValue(mode, raw);\n if (result) onChange(...result);\n }}\n />\n <button className={styles.inputCopyBtn} onClick={onCopy} tabIndex={-1} title=\"Copia\">\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </div>\n );\n};\n\n// ─── Main component ────────────────────────────────────────────────────────────\n\nexport interface ColorPickerProps {\n value?: string;\n onChange?: (color: ColorValue) => void;\n showAlpha?: boolean;\n recentColors?: string[];\n accent?: string;\n className?: string;\n theme?: \"light\" | \"dark\";\n}\n\nfunction parseInitial(value?: string): [number, number, number, number] {\n if (value?.startsWith(\"#\")) {\n const [h, s, l] = hexToHsl(value);\n return [h, s, l, 1];\n }\n return [217, 91, 60, 1];\n}\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n onChange,\n showAlpha = true,\n recentColors = [],\n accent,\n className,\n theme,\n}) => {\n const init = parseInitial(value);\n const [h, setH] = useState(init[0]);\n const [s, setS] = useState(init[1]);\n const [l, setL] = useState(init[2]);\n const [a, setA] = useState(init[3]);\n const [mode, setMode] = useState<\"hex\" | \"hsl\" | \"rgb\">(\"hex\");\n const [copied, setCopied] = useState(false);\n const [hasEyeDropper, setHasEyeDropper] = useState(false);\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n setHasEyeDropper(typeof window !== \"undefined\" && \"EyeDropper\" in window);\n }, []);\n\n // Sync from value prop (controlled)\n useEffect(() => {\n if (value?.startsWith(\"#\")) {\n const [nh, ns, nl] = hexToHsl(value);\n setH(nh); setS(ns); setL(nl);\n }\n }, [value]);\n\n // Render disc canvas via ImageData\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n const img = ctx.createImageData(DISC, DISC);\n const data = img.data;\n const cx = DISC / 2;\n const cy = DISC / 2;\n const radius = DISC / 2;\n\n for (let py = 0; py < DISC; py++) {\n for (let px = 0; px < DISC; px++) {\n const dx = px - cx;\n const dy = py - cy;\n const r = Math.sqrt(dx * dx + dy * dy);\n const idx = (py * DISC + px) * 4;\n if (r > radius) { data[idx + 3] = 0; continue; }\n const theta = (Math.atan2(dy, dx) * 180) / Math.PI;\n const hue = (theta + 360) % 360;\n const sat = (r / radius) * 100;\n const { r: rr, g: gg, b: bb } = hslToRgb(hue, sat, l);\n data[idx] = rr;\n data[idx + 1] = gg;\n data[idx + 2] = bb;\n // soft edge anti-alias\n data[idx + 3] = r > radius - 1 ? Math.round(255 * (radius - r)) : 255;\n }\n }\n ctx.putImageData(img, 0, 0);\n }, [l]);\n\n const notify = useCallback(\n (nh: number, ns: number, nl: number, na: number) => {\n onChange?.(buildColorValue(nh, ns, nl, na));\n },\n [onChange]\n );\n\n // Disc drag\n const updateDisc = useCallback(\n (clientX: number, clientY: number, rect: DOMRect) => {\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const dx = clientX - cx;\n const dy = clientY - cy;\n const r = Math.sqrt(dx * dx + dy * dy);\n const radius = rect.width / 2;\n const clampedR = Math.min(r, radius);\n const theta = (Math.atan2(dy, dx) * 180) / Math.PI;\n const nh = (theta + 360) % 360;\n const ns = (clampedR / radius) * 100;\n setH(nh); setS(ns);\n notify(nh, ns, l, a);\n },\n [l, a, notify]\n );\n\n const handleDiscPointerDown = useCallback(\n (e: React.PointerEvent<HTMLCanvasElement>) => {\n e.currentTarget.setPointerCapture(e.pointerId);\n updateDisc(e.clientX, e.clientY, e.currentTarget.getBoundingClientRect());\n },\n [updateDisc]\n );\n\n const handleDiscPointerMove = useCallback(\n (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (e.buttons === 0) return;\n updateDisc(e.clientX, e.clientY, e.currentTarget.getBoundingClientRect());\n },\n [updateDisc]\n );\n\n const handleLChange = useCallback(\n (nl: number) => { setL(nl); notify(h, s, nl, a); },\n [h, s, a, notify]\n );\n\n const handleAChange = useCallback(\n (val: number) => { const na = val / 100; setA(na); notify(h, s, l, na); },\n [h, s, l, notify]\n );\n\n // Computed\n const { r: rr, g: gg, b: bb } = hslToRgb(h, s, l);\n const luminance = (0.299 * rr + 0.587 * gg + 0.114 * bb) / 255;\n const swatchFg = luminance > 0.6 ? \"rgba(0,0,0,0.5)\" : \"rgba(255,255,255,0.9)\";\n const hexStr = hslToHex(h, s, l);\n const rgbStr = `rgb(${rr}, ${gg}, ${bb})`;\n const colorValue = buildColorValue(h, s, l, a);\n\n // Dot position on canvas (canvas coords → CSS px)\n const dotX = DISC / 2 + (s / 100) * (DISC / 2) * Math.cos((h * Math.PI) / 180);\n const dotY = DISC / 2 + (s / 100) * (DISC / 2) * Math.sin((h * Math.PI) / 180);\n\n // L slider gradient\n const lGradient = `linear-gradient(to right,\n hsl(${h}, ${s}%, 5%),\n hsl(${h}, ${s}%, 50%),\n hsl(${h}, ${s}%, 95%))`;\n\n // Alpha gradient\n const alphaGradient = `linear-gradient(to right, transparent, ${rgbStr})`;\n\n // EyeDropper\n const handleEyeDropper = async () => {\n if (!window.EyeDropper) return;\n try {\n const result = await new window.EyeDropper().open();\n const [nh, ns, nl] = hexToHsl(result.sRGBHex);\n setH(nh); setS(ns); setL(nl);\n notify(nh, ns, nl, a);\n } catch {\n // user cancelled\n }\n };\n\n // Copy\n const handleCopy = () => {\n const text =\n mode === \"hex\" ? colorValue.hexa :\n mode === \"hsl\" ? colorValue.hsla :\n colorValue.rgba;\n navigator.clipboard.writeText(text).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n });\n };\n\n // Swatch click\n const handleSwatch = (color: string) => {\n const [nh, ns, nl] = hexToHsl(color);\n setH(nh); setS(ns); setL(nl);\n notify(nh, ns, nl, a);\n };\n\n // Accent vars\n const accentVars = accent ? accentToCssVars(deriveAccent(accent), \"colorpicker\") : {};\n\n const displayValue =\n mode === \"hex\" ? colorValue.hexa :\n mode === \"hsl\" ? colorValue.hsla :\n colorValue.rgba;\n\n return (\n <div\n className={[styles.colorPicker, className ?? \"\"].filter(Boolean).join(\" \")}\n data-theme={theme}\n style={accentVars as React.CSSProperties}\n >\n {/* Disc */}\n <div className={styles.topRow}>\n <div className={styles.discWrapper}>\n <canvas\n ref={canvasRef}\n width={DISC}\n height={DISC}\n className={styles.disc}\n onPointerDown={handleDiscPointerDown}\n onPointerMove={handleDiscPointerMove}\n />\n <div\n className={styles.dot}\n style={{\n left: dotX,\n top: dotY,\n borderColor: l > 55 ? \"rgba(0,0,0,0.5)\" : \"rgba(255,255,255,0.85)\",\n }}\n />\n </div>\n </div>\n\n {/* Lightness slider */}\n <SliderControl\n value={l}\n onChange={handleLChange}\n min={0}\n max={100}\n step={1}\n showTooltip=\"never\"\n railBackground={lGradient}\n />\n\n {/* Alpha slider */}\n {showAlpha && (\n <SliderControl\n value={Math.round(a * 100)}\n onChange={handleAChange}\n min={0}\n max={100}\n step={1}\n showTooltip=\"never\"\n railBackground={`linear-gradient(to right, transparent, ${rgbStr}), repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 0 / 10px 10px`}\n />\n )}\n\n {/* Preview swatch */}\n <div\n className={styles.previewSwatch}\n style={{ background: showAlpha ? colorValue.rgba : hexStr }}\n >\n {hasEyeDropper && (\n <button\n className={styles.eyedropperBtn}\n onClick={handleEyeDropper}\n title=\"Pick color\"\n style={{ color: swatchFg, background: `rgba(${luminance > 0.6 ? \"0,0,0\" : \"255,255,255\"},0.15)` }}\n >\n <EyedropperIcon />\n </button>\n )}\n </div>\n\n {/* Mode tabs + inputs */}\n <div className={styles.inputSection}>\n <div className={styles.tabs}>\n {([\"hex\", \"hsl\", \"rgb\"] as const).map((m) => (\n <button\n key={m}\n className={[styles.tab, mode === m ? styles.tabActive : \"\"].filter(Boolean).join(\" \")}\n onClick={() => setMode(m)}\n >\n {m.toUpperCase()}\n </button>\n ))}\n </div>\n\n <ColorInput\n mode={mode}\n h={h} s={s} l={l}\n r={rr} g={gg} b={bb}\n hex={hexStr}\n onChange={(nh, ns, nl) => {\n setH(nh); setS(ns); setL(nl);\n notify(nh, ns, nl, a);\n }}\n onCopy={handleCopy}\n copied={copied}\n />\n </div>\n\n {/* Recent colors */}\n {recentColors.length > 0 && (\n <div className={styles.recents}>\n <span className={styles.recentsLabel}>Recent</span>\n <div className={styles.swatches}>\n {recentColors.slice(0, 8).map((c, i) => (\n <button\n key={i}\n className={styles.recentSwatch}\n style={{ background: c }}\n onClick={() => handleSwatch(c)}\n title={c}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n};\n","@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.counter {\n display: inline-flex;\n align-items: center;\n gap: 1px;\n font-family: var(--font-family-base);\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n color: var(--sliding-counter-accent-dot, var(--accent-dot));\n user-select: none;\n}\n\n.sign {\n line-height: 1;\n margin-right: 2px;\n}\n\n.separator {\n line-height: 1;\n margin: 0 1px;\n opacity: 0.5;\n align-self: flex-end;\n padding-bottom: 0.5em;\n}\n\n.reelWindow {\n overflow: hidden;\n position: relative;\n}\n.reelWindow.sm {\n height: 1.6rem;\n width: 0.85rem;\n font-size: 1.25rem;\n line-height: 1.6rem;\n}\n.reelWindow.md {\n height: 2.6rem;\n width: 1.35rem;\n font-size: 2rem;\n line-height: 2.6rem;\n}\n.reelWindow.lg {\n height: 3.8rem;\n width: 2rem;\n font-size: 3rem;\n line-height: 3.8rem;\n}\n\n.reel {\n display: flex;\n flex-direction: column;\n transition: transform 420ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.digitCell {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n.reelWindow.sm .digitCell {\n height: 1.6rem;\n width: 0.85rem;\n}\n.reelWindow.md .digitCell {\n height: 2.6rem;\n width: 1.35rem;\n}\n.reelWindow.lg .digitCell {\n height: 3.8rem;\n width: 2rem;\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlNsaWRpbmdDb3VudGVyLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQ3pGRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUlGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7O0FBR0U7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFKRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUpGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQU1OO0VBQ0U7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUdFO0VBQ0U7RUFDQTs7QUFGRjtFQUNFO0VBQ0E7O0FBRkY7RUFDRTtFQUNBIiwic291cmNlc0NvbnRlbnQiOlsiQHVzZSBcInNhc3M6Y29sb3JcIjtcblxuQGltcG9ydCB1cmwoXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PUludGVyOndnaHRANDAwOzUwMDs2MDAmZGlzcGxheT1zd2FwXCIpO1xuXG4vLyBBY2NlbnQgZGkgZGVmYXVsdCDigJQgY2FtYmlhIHF1aSBwZXIgYWdnaW9ybmFyZSB0dXR0YSBsYSBsaWJyZXJpYVxuJGFjY2VudDogIzNiODJmNjtcblxuOnJvb3Qge1xuICAvLyBBY2NlbnQgc2NhbGUg4oCUIGRlcml2YXRhIGRhICRhY2NlbnQgYSBjb21waWxlIHRpbWVcbiAgLS1hY2NlbnQ6ICAgICAgICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1kb3Q6ICAgICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tYWNjZW50LXRyYWNrOiAgI3skYWNjZW50fTtcbiAgLS1hY2NlbnQtcmluZzogICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1nbG93OiAgICN7Y29sb3IuY2hhbmdlKCRhY2NlbnQsICRhbHBoYTogMC4zKX07XG4gIC0tYWNjZW50LWxpZ2h0OiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0NSUsICRzYXR1cmF0aW9uOiAtMjAlKX07XG5cbiAgLy8gUHJpbWFyeSBzY2FsZSAobWFudGVudXRhIHBlciByZXRyb2NvbXBhdGliaWxpdMOgIGNvbiBCdXR0b24sIEJhZGdlLCBJbnB1dClcbiAgLS1jb2xvci1wcmltYXJ5LTUwOiAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0OSUsICRzYXR1cmF0aW9uOiAtMzAlKX07XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogNDIlLCAkc2F0dXJhdGlvbjogLTE1JSl9O1xuICAtLWNvbG9yLXByaW1hcnktNDAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDEyJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNTAwOiAjeyRhY2NlbnR9O1xuICAtLWNvbG9yLXByaW1hcnktNjAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0xMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTcwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAtMjAlKX07XG5cbiAgLy8gTmV1dHJhbFxuICAtLWNvbG9yLW5ldXRyYWwtMDogICAjZmZmZmZmO1xuICAtLWNvbG9yLW5ldXRyYWwtMTAwOiAjZjNmNGY2O1xuICAtLWNvbG9yLW5ldXRyYWwtMjAwOiAjZTVlN2ViO1xuICAtLWNvbG9yLW5ldXRyYWwtNDAwOiAjOWNhM2FmO1xuICAtLWNvbG9yLW5ldXRyYWwtNjAwOiAjNGI1NTYzO1xuICAtLWNvbG9yLW5ldXRyYWwtOTAwOiAjMTExODI3O1xuXG4gIC8vIFNlbWFudGljXG4gIC0tY29sb3Itc3VjY2Vzcy01MDA6ICMyMmM1NWU7XG4gIC0tY29sb3Itc3VjY2Vzcy02MDA6ICMxNmEzNGE7XG4gIC0tY29sb3ItZGFuZ2VyLTUwMDogICNlZjQ0NDQ7XG4gIC0tY29sb3ItZGFuZ2VyLTYwMDogICNkYzI2MjY7XG4gIC0tY29sb3Itd2FybmluZy01MDA6ICNmNTllMGI7XG4gIC0tY29sb3Itd2FybmluZy02MDA6ICNkOTc3MDY7XG5cbiAgLy8gVHlwb2dyYXBoeVxuICAtLWZvbnQtZmFtaWx5LWJhc2U6IFwiSW50ZXJcIiwgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBzYW5zLXNlcmlmO1xuICAtLWZvbnQtc2l6ZS14czogMC43NXJlbTtcbiAgLS1mb250LXNpemUtc206IDAuODc1cmVtO1xuICAtLWZvbnQtc2l6ZS1tZDogMXJlbTtcbiAgLS1mb250LXNpemUtbGc6IDEuMTI1cmVtO1xuXG4gIC8vIFNwYWNpbmdcbiAgLS1zcGFjaW5nLTE6IDAuMjVyZW07XG4gIC0tc3BhY2luZy0yOiAwLjVyZW07XG4gIC0tc3BhY2luZy0zOiAwLjc1cmVtO1xuICAtLXNwYWNpbmctNDogMXJlbTtcblxuICAvLyBSYWRpdXNcbiAgLS1yYWRpdXMtc206ICAgMC4yNXJlbTtcbiAgLS1yYWRpdXMtbWQ6ICAgMC4zNzVyZW07XG4gIC0tcmFkaXVzLWxnOiAgIDAuNXJlbTtcbiAgLS1yYWRpdXMtZnVsbDogOTk5OXB4O1xuXG4gIC8vIFNoYWRvd3NcbiAgLS1zaGFkb3ctc206IDAgMXB4IDJweCAwIHJnYigwIDAgMCAvIDAuMDUpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC4xKSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC4xKTtcblxuICAvLyBUcmFuc2l0aW9uc1xuICAtLXRyYW5zaXRpb24tZmFzdDogMTUwbXMgZWFzZTtcblxuICAvLyBTdXJmYWNlIChiYWNrZ3JvdW5kIGRpIGNhcmQvcGFuZWwpXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgI2ZmZmZmZjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjZmZmZmZmO1xufVxuXG4vLyDilIDilIDilIAgRGFyayB0aGVtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEFwcGxpY2F0byB2aWEgZGF0YS10aGVtZT1cImRhcmtcIiBzdWxsJ2VsZW1lbnRvIHJvb3QgKGdlc3RpdG8gZGEgU3Rvcnlib29rIGRlY29yYXRvclxuLy8gZSBkYWxsJ2FwcCBjb25zdW1lcikuIEkgY29tcG9uZW50aSBub24gZGV2b25vIGZhcmUgbnVsbGEgZGkgc3BlY2lhbGU6IGJhc3RhIGNoZVxuLy8gdXNpbm8gaSB0b2tlbiB2YXIoKSBlIHJpY2V2ZXJhbm5vIGF1dG9tYXRpY2FtZW50ZSBpIHZhbG9yaSBkYXJrLlxuXG5bZGF0YS10aGVtZT1cImRhcmtcIl0ge1xuICAvLyBOZXV0cmFsIChzY2FsYSBpbnZlcnRpdGEpXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICMwZjE3MmE7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICMxZTI5M2I7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICMzMzQxNTU7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5NGEzYjg7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICNjYmQ1ZTE7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICNmOGZhZmM7XG5cbiAgLy8gU3VyZmFjZVxuICAtLWNvbG9yLXN1cmZhY2U6ICAgICAgICAgICMxZTI5M2I7XG4gIC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZDogIzI3MzU0OTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIGRhcmsgKHBlciBpbCBkZWZhdWx0IGFjY2VudCBibHUg4oCUIGxlIHNmdW1hdHVyZSBjaGlhcmUgZGl2ZW50YW5vIHNjdXJlKVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAjMTcyNTU0O1xuICAtLWNvbG9yLXByaW1hcnktMTAwOiAjMWUzYThhO1xuICAvLyA0MDAgLyA1MDAgLyA2MDAgLyA3MDAgcmltYW5nb25vIGludmFyaWF0aSAoYWJiYXN0YW56YSBzYXR1cmkgc3UgYmcgc2N1cm8pXG5cbiAgLy8gQWNjZW50IGxpZ2h0OiB2YXJpYW50ZSBzY3VyYVxuICAtLWFjY2VudC1saWdodDogIzE3MjU1NDtcblxuICAvLyBTaGFkb3dzIChwacO5IGZvcnRpIHN1IGJnIHNjdXJvKVxuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC40KTtcbiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDZweCAtMXB4IHJnYigwIDAgMCAvIDAuNSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIDAuNCk7XG59XG4iLCJAdXNlIFwiLi4vLi4vc3R5bGVzL3Rva2Vuc1wiO1xuXG4vLyDilIDilIAgU2l6ZSBtYXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4kc2l6ZXM6IChcbiAgc206IChmb250OiAxLjI1cmVtLCBjZWxsOiAxLjZyZW0sIHdpZHRoOiAwLjg1cmVtKSxcbiAgbWQ6IChmb250OiAycmVtLCAgICBjZWxsOiAyLjZyZW0sIHdpZHRoOiAxLjM1cmVtKSxcbiAgbGc6IChmb250OiAzcmVtLCAgICBjZWxsOiAzLjhyZW0sIHdpZHRoOiAycmVtKSxcbik7XG5cbi8vIOKUgOKUgCBDb3VudGVyIHdyYXBwZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4uY291bnRlciB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDFweDtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICBmb250LXdlaWdodDogNjAwO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICBjb2xvcjogdmFyKC0tc2xpZGluZy1jb3VudGVyLWFjY2VudC1kb3QsIHZhcigtLWFjY2VudC1kb3QpKTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi8vIOKUgOKUgCBTaWduIChtaW51cykgYW5kIGRlY2ltYWwgc2VwYXJhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLnNpZ24ge1xuICBsaW5lLWhlaWdodDogMTtcbiAgbWFyZ2luLXJpZ2h0OiAycHg7XG59XG5cbi5zZXBhcmF0b3Ige1xuICBsaW5lLWhlaWdodDogMTtcbiAgbWFyZ2luOiAwIDFweDtcbiAgb3BhY2l0eTogMC41O1xuICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgcGFkZGluZy1ib3R0b206IDAuNWVtO1xufVxuXG4vLyDilIDilIAgUmVlbCB3aW5kb3cg4oCUIGNsaXBzIHRvIG9uZSBkaWdpdCBoZWlnaHQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4ucmVlbFdpbmRvdyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICBAZWFjaCAkbmFtZSwgJG1hcCBpbiAkc2l6ZXMge1xuICAgICYuI3skbmFtZX0ge1xuICAgICAgaGVpZ2h0OiBtYXAtZ2V0KCRtYXAsIGNlbGwpO1xuICAgICAgd2lkdGg6IG1hcC1nZXQoJG1hcCwgd2lkdGgpO1xuICAgICAgZm9udC1zaXplOiBtYXAtZ2V0KCRtYXAsIGZvbnQpO1xuICAgICAgbGluZS1oZWlnaHQ6IG1hcC1nZXQoJG1hcCwgY2VsbCk7XG4gICAgfVxuICB9XG59XG5cbi8vIOKUgOKUgCBUaGUgc2Nyb2xsaW5nIGNvbHVtbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi5yZWVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDQyMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG59XG5cbi8vIOKUgOKUgCBTaW5nbGUgZGlnaXQgY2VsbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi5kaWdpdENlbGwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgZmxleC1zaHJpbms6IDA7XG5cbiAgQGVhY2ggJG5hbWUsICRtYXAgaW4gJHNpemVzIHtcbiAgICAucmVlbFdpbmRvdy4jeyRuYW1lfSAmIHtcbiAgICAgIGhlaWdodDogbWFwLWdldCgkbWFwLCBjZWxsKTtcbiAgICAgIHdpZHRoOiBtYXAtZ2V0KCRtYXAsIHdpZHRoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== */","import React, { useEffect, useRef, useState } from \"react\";\nimport styles from \"./SlidingCounter.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport type SlidingCounterSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface SlidingCounterProps {\n value: number;\n /** Minimum integer digits shown (zero-padded on the left) */\n minDigits?: number;\n /** Number of decimal digits to display. 0 = no decimals. */\n decimals?: number;\n /** Decimal separator character */\n decimalSeparator?: string;\n size?: SlidingCounterSize;\n /** Custom accent color — overrides the global theme for this instance */\n accent?: string;\n className?: string;\n}\n\ninterface DigitReelProps {\n digit: number;\n direction: \"up\" | \"down\";\n size: SlidingCounterSize;\n}\n\n// 3 copies of 0-9: [0-9 | 0-9 | 0-9] — middle copy is the \"home\" position.\n// After each transition we silently snap back to middle to keep the range usable indefinitely.\nconst COPIES = 3;\nconst TOTAL = COPIES * 10; // 30 cells\n\nconst DigitReel: React.FC<DigitReelProps> = ({ digit, direction, size }) => {\n const posRef = useRef(10 + digit);\n const prevDigitRef = useRef(digit);\n const [pos, setPos] = useState(10 + digit);\n const [animate, setAnimate] = useState(true);\n\n useEffect(() => {\n if (prevDigitRef.current === digit) return;\n\n const prev = prevDigitRef.current;\n let next = posRef.current;\n\n if (direction === \"up\") {\n next += digit > prev ? digit - prev : 10 - prev + digit;\n } else {\n next -= digit < prev ? prev - digit : prev + 10 - digit;\n }\n\n posRef.current = next;\n prevDigitRef.current = digit;\n setAnimate(true);\n setPos(next);\n }, [digit, direction]);\n\n const handleTransitionEnd = () => {\n const normalized = 10 + (((posRef.current % 10) + 10) % 10);\n posRef.current = normalized;\n setAnimate(false);\n setPos(normalized);\n };\n\n const translateY = -(pos / TOTAL) * 100;\n\n const cells = Array.from({ length: COPIES }, () =>\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n ).flat();\n\n return (\n <div className={`${styles.reelWindow} ${styles[size]}`}>\n <div\n className={styles.reel}\n style={{\n transform: `translateY(${translateY}%)`,\n transition: animate ? undefined : \"none\",\n }}\n onTransitionEnd={handleTransitionEnd}\n >\n {cells.map((d, i) => (\n <div key={i} className={styles.digitCell}>\n {d}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\n/** Split a number into integer and decimal digit arrays with explicit decimal places. */\nfunction splitDigits(\n value: number,\n minDigits: number,\n decimals: number\n): { intDigits: number[]; decDigits: number[] } {\n const abs = Math.abs(value);\n const fixed = abs.toFixed(decimals);\n const [intPart, decPart = \"\"] = fixed.split(\".\");\n\n const intDigits = intPart.split(\"\").map(Number);\n const padded =\n intDigits.length < minDigits\n ? [...Array(minDigits - intDigits.length).fill(0), ...intDigits]\n : intDigits;\n\n const decDigits = decPart.split(\"\").map(Number);\n\n return { intDigits: padded, decDigits };\n}\n\nexport const SlidingCounter: React.FC<SlidingCounterProps> = ({\n value,\n minDigits = 1,\n decimals = 0,\n decimalSeparator = \".\",\n size = \"md\",\n accent,\n className,\n}) => {\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"sliding-counter\")\n : {};\n\n const safeValue = isFinite(value) ? value : 0;\n\n const prevValueRef = useRef(safeValue);\n const direction = safeValue >= prevValueRef.current ? \"up\" : \"down\";\n prevValueRef.current = safeValue;\n\n const { intDigits, decDigits } = splitDigits(safeValue, minDigits, decimals);\n\n return (\n <div\n className={[styles.counter, styles[size], className ?? \"\"]\n .filter(Boolean)\n .join(\" \")}\n style={accentVars as React.CSSProperties}\n aria-label={safeValue.toFixed(decimals)}\n >\n {safeValue < 0 && <span className={styles.sign}>−</span>}\n\n {intDigits.map((digit, i) => (\n <DigitReel key={`int-${intDigits.length - i}`} digit={digit} direction={direction} size={size} />\n ))}\n\n {decimals > 0 && (\n <span className={styles.separator}>{decimalSeparator}</span>\n )}\n\n {decDigits.map((digit, i) => (\n <DigitReel key={`dec-${i}`} digit={digit} direction={direction} size={size} />\n ))}\n </div>\n );\n};\n","@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.root {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-lg);\n background: var(--color-surface);\n transition: border-color var(--transition-fast), box-shadow var(--transition-fast);\n}\n.root:focus-within {\n border-color: var(--rich-text-editor-accent-ring, var(--accent-ring));\n box-shadow: 0 0 0 3px var(--rich-text-editor-accent-glow, var(--accent-glow));\n}\n\n.readOnly {\n border-color: transparent;\n background: transparent;\n}\n.readOnly:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n\n.toolbar {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n padding: var(--spacing-1) var(--spacing-2);\n background: var(--color-surface-elevated);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n flex-shrink: 0;\n position: sticky;\n top: var(--spacing-1);\n margin: var(--spacing-1) var(--spacing-1) 0;\n z-index: 10;\n}\n\n.toolbarGroup {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.divider {\n width: 1px;\n height: 18px;\n background: var(--color-neutral-200);\n margin: 0 var(--spacing-1);\n flex-shrink: 0;\n}\n\n.toolbarButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n border: none;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--color-neutral-600);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-family: var(--font-family-base);\n line-height: 1;\n transition: background var(--transition-fast), color var(--transition-fast);\n}\n.toolbarButton:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n.toolbarButton:focus-visible {\n outline: 2px solid var(--rich-text-editor-accent-ring, var(--accent-ring));\n outline-offset: 1px;\n}\n.toolbarButton.active {\n background: var(--rich-text-editor-accent-light, var(--accent-light));\n color: var(--rich-text-editor-accent, var(--accent));\n}\n\n.headingButton {\n width: auto;\n min-width: 28px;\n padding: 0 var(--spacing-2);\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.02em;\n}\n\n.bubbleMenu {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: var(--spacing-1) var(--spacing-2);\n background: var(--color-surface-elevated);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-md);\n}\n\n.prose {\n color: var(--color-neutral-900);\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n line-height: 1.65;\n}\n.prose > * + * {\n margin-top: 0.5em;\n}\n.prose p {\n margin: 0;\n}\n.prose h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.25;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.prose h1:first-child {\n margin-top: 0;\n}\n.prose h2 {\n font-size: 1.375rem;\n font-weight: 600;\n line-height: 1.3;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.prose h2:first-child {\n margin-top: 0;\n}\n.prose h3 {\n font-size: 1.125rem;\n font-weight: 600;\n line-height: 1.4;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.prose h3:first-child {\n margin-top: 0;\n}\n.prose ul, .prose ol {\n padding-left: 1.5em;\n margin: 0.5em 0;\n}\n.prose ul {\n list-style-type: disc;\n}\n.prose ol {\n list-style-type: decimal;\n}\n.prose li {\n line-height: 1.65;\n}\n.prose li + li {\n margin-top: 0.25em;\n}\n.prose li p {\n margin: 0;\n}\n.prose {\n padding: var(--spacing-3) var(--spacing-4);\n}\n\n.editorContent {\n flex: 1;\n overflow-y: auto;\n max-height: var(--rte-max-height);\n scrollbar-width: thin;\n scrollbar-color: var(--color-neutral-200) transparent;\n}\n.editorContent::-webkit-scrollbar {\n width: 4px;\n}\n.editorContent::-webkit-scrollbar-track {\n background: transparent;\n}\n.editorContent::-webkit-scrollbar-thumb {\n background: var(--color-neutral-200);\n border-radius: var(--radius-full);\n}\n.editorContent::before {\n content: \"\";\n display: block;\n position: sticky;\n top: 0;\n pointer-events: none;\n z-index: 9;\n}\n.editorContent :global(.ProseMirror) {\n color: var(--color-neutral-900);\n font-family: var(--font-family-base);\n font-size: var(--font-size-md);\n line-height: 1.65;\n}\n.editorContent :global(.ProseMirror) > * + * {\n margin-top: 0.5em;\n}\n.editorContent :global(.ProseMirror) p {\n margin: 0;\n}\n.editorContent :global(.ProseMirror) h1 {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.25;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.editorContent :global(.ProseMirror) h1:first-child {\n margin-top: 0;\n}\n.editorContent :global(.ProseMirror) h2 {\n font-size: 1.375rem;\n font-weight: 600;\n line-height: 1.3;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.editorContent :global(.ProseMirror) h2:first-child {\n margin-top: 0;\n}\n.editorContent :global(.ProseMirror) h3 {\n font-size: 1.125rem;\n font-weight: 600;\n line-height: 1.4;\n color: var(--color-neutral-900);\n margin-top: 0.75em;\n margin-bottom: 0.25em;\n}\n.editorContent :global(.ProseMirror) h3:first-child {\n margin-top: 0;\n}\n.editorContent :global(.ProseMirror) ul, .editorContent :global(.ProseMirror) ol {\n padding-left: 1.5em;\n margin: 0.5em 0;\n}\n.editorContent :global(.ProseMirror) ul {\n list-style-type: disc;\n}\n.editorContent :global(.ProseMirror) ol {\n list-style-type: decimal;\n}\n.editorContent :global(.ProseMirror) li {\n line-height: 1.65;\n}\n.editorContent :global(.ProseMirror) li + li {\n margin-top: 0.25em;\n}\n.editorContent :global(.ProseMirror) li p {\n margin: 0;\n}\n.editorContent :global(.ProseMirror) {\n min-height: var(--rte-min-height, 200px);\n padding: var(--spacing-3) var(--spacing-4);\n outline: none;\n caret-color: var(--rich-text-editor-accent, var(--accent));\n}\n.editorContent :global(.ProseMirror) p.is-empty:first-child::before {\n content: attr(data-placeholder);\n color: var(--color-neutral-400);\n pointer-events: none;\n float: left;\n height: 0;\n}\n.editorContent :global(.ProseMirror) div[data-type=page-break] {\n position: relative;\n margin: 1em 0;\n border: none;\n height: 0;\n border-top: 2px dashed var(--color-neutral-200);\n pointer-events: none;\n user-select: none;\n}\n.editorContent :global(.ProseMirror) div[data-type=page-break]::after {\n content: \"Page break\";\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n padding: 0 var(--spacing-2);\n background: var(--color-surface);\n font-size: var(--font-size-xs);\n color: var(--color-neutral-400);\n font-family: var(--font-family-base);\n white-space: nowrap;\n}\n.editorContent :global(.ProseMirror) ::selection {\n background: var(--rich-text-editor-accent-light, var(--accent-light));\n}\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3N0eWxlcy90b2tlbnMuc2NzcyIsIlJpY2hUZXh0RWRpdG9yLm1vZHVsZS5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVRO0FBS1I7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUdBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7OztBQVFGO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0E7RUFDQTtFQUdBO0VBQ0E7RUFJQTtFQUdBO0VBQ0E7OztBQy9GRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxZQUNFOztBQUVGO0VBQ0U7RUFDQTs7O0FBSUo7RUFDRTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7O0FBTUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUtGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLFlBQ0U7O0FBR0Y7RUFDRTtFQUNBOztBQUdGO0VBQ0U7RUFDQTs7QUFHRjtFQUNFO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQThERjtFQXZERTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUFVOztBQUVWO0VBQUk7O0FBRUo7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBQ0E7RUFBZ0I7O0FBR2xCO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUNBO0VBQWdCOztBQUdsQjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFDQTtFQUFnQjs7QUFHbEI7RUFDRTtFQUNBOztBQUdGO0VBQUs7O0FBQ0w7RUFBSzs7QUFFTDtFQUNFOztBQUNBO0VBQU87O0FBQ1A7RUFBSTs7QUFLUjtFQUVFOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFBdUI7O0FBQ3ZCO0VBQTZCOztBQUM3QjtFQUNFO0VBQ0E7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUlBO0VBQ0E7O0FBR0Y7RUF4RkE7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFBVTs7QUFFVjtFQUFJOztBQUVKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUNBO0VBQWdCOztBQUdsQjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFDQTtFQUFnQjs7QUFHbEI7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBQ0E7RUFBZ0I7O0FBR2xCO0VBQ0U7RUFDQTs7QUFHRjtFQUFLOztBQUNMO0VBQUs7O0FBRUw7RUFDRTs7QUFDQTtFQUFPOztBQUNQO0VBQUk7O0FBc0NOO0VBRUU7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUlKO0VBQ0UiLCJzb3VyY2VzQ29udGVudCI6WyJAdXNlIFwic2Fzczpjb2xvclwiO1xuXG5AaW1wb3J0IHVybChcImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9SW50ZXI6d2dodEA0MDA7NTAwOzYwMCZkaXNwbGF5PXN3YXBcIik7XG5cbi8vIEFjY2VudCBkaSBkZWZhdWx0IOKAlCBjYW1iaWEgcXVpIHBlciBhZ2dpb3JuYXJlIHR1dHRhIGxhIGxpYnJlcmlhXG4kYWNjZW50OiAjM2I4MmY2O1xuXG46cm9vdCB7XG4gIC8vIEFjY2VudCBzY2FsZSDigJQgZGVyaXZhdGEgZGEgJGFjY2VudCBhIGNvbXBpbGUgdGltZVxuICAtLWFjY2VudDogICAgICAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWRvdDogICAgI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiAxMiUpfTtcbiAgLS1hY2NlbnQtdHJhY2s6ICAjeyRhY2NlbnR9O1xuICAtLWFjY2VudC1yaW5nOiAgICN7JGFjY2VudH07XG4gIC0tYWNjZW50LWdsb3c6ICAgI3tjb2xvci5jaGFuZ2UoJGFjY2VudCwgJGFscGhhOiAwLjMpfTtcbiAgLS1hY2NlbnQtbGlnaHQ6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ1JSwgJHNhdHVyYXRpb246IC0yMCUpfTtcblxuICAvLyBQcmltYXJ5IHNjYWxlIChtYW50ZW51dGEgcGVyIHJldHJvY29tcGF0aWJpbGl0w6AgY29uIEJ1dHRvbiwgQmFkZ2UsIElucHV0KVxuICAtLWNvbG9yLXByaW1hcnktNTA6ICAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IDQ5JSwgJHNhdHVyYXRpb246IC0zMCUpfTtcbiAgLS1jb2xvci1wcmltYXJ5LTEwMDogI3tjb2xvci5zY2FsZSgkYWNjZW50LCAkbGlnaHRuZXNzOiA0MiUsICRzYXR1cmF0aW9uOiAtMTUlKX07XG4gIC0tY29sb3ItcHJpbWFyeS00MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogMTIlKX07XG4gIC0tY29sb3ItcHJpbWFyeS01MDA6ICN7JGFjY2VudH07XG4gIC0tY29sb3ItcHJpbWFyeS02MDA6ICN7Y29sb3Iuc2NhbGUoJGFjY2VudCwgJGxpZ2h0bmVzczogLTEwJSl9O1xuICAtLWNvbG9yLXByaW1hcnktNzAwOiAje2NvbG9yLnNjYWxlKCRhY2NlbnQsICRsaWdodG5lc3M6IC0yMCUpfTtcblxuICAvLyBOZXV0cmFsXG4gIC0tY29sb3ItbmV1dHJhbC0wOiAgICNmZmZmZmY7XG4gIC0tY29sb3ItbmV1dHJhbC0xMDA6ICNmM2Y0ZjY7XG4gIC0tY29sb3ItbmV1dHJhbC0yMDA6ICNlNWU3ZWI7XG4gIC0tY29sb3ItbmV1dHJhbC00MDA6ICM5Y2EzYWY7XG4gIC0tY29sb3ItbmV1dHJhbC02MDA6ICM0YjU1NjM7XG4gIC0tY29sb3ItbmV1dHJhbC05MDA6ICMxMTE4Mjc7XG5cbiAgLy8gU2VtYW50aWNcbiAgLS1jb2xvci1zdWNjZXNzLTUwMDogIzIyYzU1ZTtcbiAgLS1jb2xvci1zdWNjZXNzLTYwMDogIzE2YTM0YTtcbiAgLS1jb2xvci1kYW5nZXItNTAwOiAgI2VmNDQ0NDtcbiAgLS1jb2xvci1kYW5nZXItNjAwOiAgI2RjMjYyNjtcbiAgLS1jb2xvci13YXJuaW5nLTUwMDogI2Y1OWUwYjtcbiAgLS1jb2xvci13YXJuaW5nLTYwMDogI2Q5NzcwNjtcblxuICAvLyBUeXBvZ3JhcGh5XG4gIC0tZm9udC1mYW1pbHktYmFzZTogXCJJbnRlclwiLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIHNhbnMtc2VyaWY7XG4gIC0tZm9udC1zaXplLXhzOiAwLjc1cmVtO1xuICAtLWZvbnQtc2l6ZS1zbTogMC44NzVyZW07XG4gIC0tZm9udC1zaXplLW1kOiAxcmVtO1xuICAtLWZvbnQtc2l6ZS1sZzogMS4xMjVyZW07XG5cbiAgLy8gU3BhY2luZ1xuICAtLXNwYWNpbmctMTogMC4yNXJlbTtcbiAgLS1zcGFjaW5nLTI6IDAuNXJlbTtcbiAgLS1zcGFjaW5nLTM6IDAuNzVyZW07XG4gIC0tc3BhY2luZy00OiAxcmVtO1xuXG4gIC8vIFJhZGl1c1xuICAtLXJhZGl1cy1zbTogICAwLjI1cmVtO1xuICAtLXJhZGl1cy1tZDogICAwLjM3NXJlbTtcbiAgLS1yYWRpdXMtbGc6ICAgMC41cmVtO1xuICAtLXJhZGl1cy1mdWxsOiA5OTk5cHg7XG5cbiAgLy8gU2hhZG93c1xuICAtLXNoYWRvdy1zbTogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gMC4wNSk7XG4gIC0tc2hhZG93LW1kOiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDJweCA0cHggLTJweCByZ2IoMCAwIDAgLyAwLjEpO1xuXG4gIC8vIFRyYW5zaXRpb25zXG4gIC0tdHJhbnNpdGlvbi1mYXN0OiAxNTBtcyBlYXNlO1xuXG4gIC8vIFN1cmZhY2UgKGJhY2tncm91bmQgZGkgY2FyZC9wYW5lbClcbiAgLS1jb2xvci1zdXJmYWNlOiAgICAgICAgICAjZmZmZmZmO1xuICAtLWNvbG9yLXN1cmZhY2UtZWxldmF0ZWQ6ICNmZmZmZmY7XG59XG5cbi8vIOKUgOKUgOKUgCBEYXJrIHRoZW1lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXBwbGljYXRvIHZpYSBkYXRhLXRoZW1lPVwiZGFya1wiIHN1bGwnZWxlbWVudG8gcm9vdCAoZ2VzdGl0byBkYSBTdG9yeWJvb2sgZGVjb3JhdG9yXG4vLyBlIGRhbGwnYXBwIGNvbnN1bWVyKS4gSSBjb21wb25lbnRpIG5vbiBkZXZvbm8gZmFyZSBudWxsYSBkaSBzcGVjaWFsZTogYmFzdGEgY2hlXG4vLyB1c2lubyBpIHRva2VuIHZhcigpIGUgcmljZXZlcmFubm8gYXV0b21hdGljYW1lbnRlIGkgdmFsb3JpIGRhcmsuXG5cbltkYXRhLXRoZW1lPVwiZGFya1wiXSB7XG4gIC8vIE5ldXRyYWwgKHNjYWxhIGludmVydGl0YSlcbiAgLS1jb2xvci1uZXV0cmFsLTA6ICAgIzBmMTcyYTtcbiAgLS1jb2xvci1uZXV0cmFsLTEwMDogIzFlMjkzYjtcbiAgLS1jb2xvci1uZXV0cmFsLTIwMDogIzMzNDE1NTtcbiAgLS1jb2xvci1uZXV0cmFsLTQwMDogIzk0YTNiODtcbiAgLS1jb2xvci1uZXV0cmFsLTYwMDogI2NiZDVlMTtcbiAgLS1jb2xvci1uZXV0cmFsLTkwMDogI2Y4ZmFmYztcblxuICAvLyBTdXJmYWNlXG4gIC0tY29sb3Itc3VyZmFjZTogICAgICAgICAgIzFlMjkzYjtcbiAgLS1jb2xvci1zdXJmYWNlLWVsZXZhdGVkOiAjMjczNTQ5O1xuXG4gIC8vIFByaW1hcnkgc2NhbGUgZGFyayAocGVyIGlsIGRlZmF1bHQgYWNjZW50IGJsdSDigJQgbGUgc2Z1bWF0dXJlIGNoaWFyZSBkaXZlbnRhbm8gc2N1cmUpXG4gIC0tY29sb3ItcHJpbWFyeS01MDogICMxNzI1NTQ7XG4gIC0tY29sb3ItcHJpbWFyeS0xMDA6ICMxZTNhOGE7XG4gIC8vIDQwMCAvIDUwMCAvIDYwMCAvIDcwMCByaW1hbmdvbm8gaW52YXJpYXRpIChhYmJhc3RhbnphIHNhdHVyaSBzdSBiZyBzY3VybylcblxuICAvLyBBY2NlbnQgbGlnaHQ6IHZhcmlhbnRlIHNjdXJhXG4gIC0tYWNjZW50LWxpZ2h0OiAjMTcyNTU0O1xuXG4gIC8vIFNoYWRvd3MgKHBpw7kgZm9ydGkgc3UgYmcgc2N1cm8pXG4gIC0tc2hhZG93LXNtOiAwIDFweCAycHggMCByZ2IoMCAwIDAgLyAwLjQpO1xuICAtLXNoYWRvdy1tZDogMCA0cHggNnB4IC0xcHggcmdiKDAgMCAwIC8gMC41KSwgMCAycHggNHB4IC0ycHggcmdiKDAgMCAwIC8gMC40KTtcbn1cbiIsIkB1c2UgXCIuLi8uLi9zdHlsZXMvdG9rZW5zXCIgYXMgKjtcblxuLy8g4pSA4pSA4pSAIFJvb3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5yb290IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sb3ItbmV1dHJhbC0yMDApO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtbGcpO1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1zdXJmYWNlKTtcbiAgdHJhbnNpdGlvbjpcbiAgICBib3JkZXItY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KSxcbiAgICBib3gtc2hhZG93IHZhcigtLXRyYW5zaXRpb24tZmFzdCk7XG4gICY6Zm9jdXMtd2l0aGluIHtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LXJpbmcsIHZhcigtLWFjY2VudC1yaW5nKSk7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LWdsb3csIHZhcigtLWFjY2VudC1nbG93KSk7XG4gIH1cbn1cblxuLnJlYWRPbmx5IHtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG5cbiAgJjpmb2N1cy13aXRoaW4ge1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVG9vbGJhciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLnRvb2xiYXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IHZhcigtLXNwYWNpbmctMSk7XG4gIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMSkgdmFyKC0tc3BhY2luZy0yKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTtcbiAgZmxleC1zaHJpbms6IDA7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHRvcDogdmFyKC0tc3BhY2luZy0xKTtcbiAgbWFyZ2luOiB2YXIoLS1zcGFjaW5nLTEpIHZhcigtLXNwYWNpbmctMSkgMDtcbiAgei1pbmRleDogMTA7XG59XG5cbi50b29sYmFyR3JvdXAge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDJweDtcbn1cblxuLmRpdmlkZXIge1xuICB3aWR0aDogMXB4O1xuICBoZWlnaHQ6IDE4cHg7XG4gIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgbWFyZ2luOiAwIHZhcigtLXNwYWNpbmctMSk7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuXG4vLyDilIDilIDilIAgVG9vbGJhciBidXR0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi50b29sYmFyQnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB3aWR0aDogMjhweDtcbiAgaGVpZ2h0OiAyOHB4O1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IG5vbmU7XG4gIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC02MDApO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXNtKTtcbiAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICBsaW5lLWhlaWdodDogMTtcbiAgdHJhbnNpdGlvbjpcbiAgICBiYWNrZ3JvdW5kIHZhcigtLXRyYW5zaXRpb24tZmFzdCksXG4gICAgY29sb3IgdmFyKC0tdHJhbnNpdGlvbi1mYXN0KTtcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xvci1uZXV0cmFsLTEwMCk7XG4gICAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtOTAwKTtcbiAgfVxuXG4gICY6Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LXJpbmcsIHZhcigtLWFjY2VudC1yaW5nKSk7XG4gICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgfVxuXG4gICYuYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1yaWNoLXRleHQtZWRpdG9yLWFjY2VudC1saWdodCwgdmFyKC0tYWNjZW50LWxpZ2h0KSk7XG4gICAgY29sb3I6IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LCB2YXIoLS1hY2NlbnQpKTtcbiAgfVxufVxuXG4uaGVhZGluZ0J1dHRvbiB7XG4gIHdpZHRoOiBhdXRvO1xuICBtaW4td2lkdGg6IDI4cHg7XG4gIHBhZGRpbmc6IDAgdmFyKC0tc3BhY2luZy0yKTtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xufVxuXG4vLyDilIDilIDilIAgQnViYmxlIG1lbnUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi5idWJibGVNZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAycHg7XG4gIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMSkgdmFyKC0tc3BhY2luZy0yKTtcbiAgYmFja2dyb3VuZDogdmFyKC0tY29sb3Itc3VyZmFjZS1lbGV2YXRlZCk7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLW1kKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LW1kKTtcbn1cblxuLy8g4pSA4pSA4pSAIFNoYXJlZCBwcm9zZSB0eXBvZ3JhcGh5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQXBwbGllZCBib3RoIHRvIHRoZSBlZGl0b3IgKC5lZGl0b3JDb250ZW50KSBhbmQgdG8gZXh0ZXJuYWwgcHJldmlldyBkaXZzICgucHJvc2UpLlxuXG5AbWl4aW4gcHJvc2Uge1xuICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICBmb250LWZhbWlseTogdmFyKC0tZm9udC1mYW1pbHktYmFzZSk7XG4gIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLW1kKTtcbiAgbGluZS1oZWlnaHQ6IDEuNjU7XG5cbiAgPiAqICsgKiB7IG1hcmdpbi10b3A6IDAuNWVtOyB9XG5cbiAgcCB7IG1hcmdpbjogMDsgfVxuXG4gIGgxIHtcbiAgICBmb250LXNpemU6IDEuNzVyZW07XG4gICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICBsaW5lLWhlaWdodDogMS4yNTtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICAgIG1hcmdpbi10b3A6IDAuNzVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07XG4gICAgJjpmaXJzdC1jaGlsZCB7IG1hcmdpbi10b3A6IDA7IH1cbiAgfVxuXG4gIGgyIHtcbiAgICBmb250LXNpemU6IDEuMzc1cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICAgIG1hcmdpbi10b3A6IDAuNzVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07XG4gICAgJjpmaXJzdC1jaGlsZCB7IG1hcmdpbi10b3A6IDA7IH1cbiAgfVxuXG4gIGgzIHtcbiAgICBmb250LXNpemU6IDEuMTI1cmVtO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItbmV1dHJhbC05MDApO1xuICAgIG1hcmdpbi10b3A6IDAuNzVlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07XG4gICAgJjpmaXJzdC1jaGlsZCB7IG1hcmdpbi10b3A6IDA7IH1cbiAgfVxuXG4gIHVsLCBvbCB7XG4gICAgcGFkZGluZy1sZWZ0OiAxLjVlbTtcbiAgICBtYXJnaW46IDAuNWVtIDA7XG4gIH1cblxuICB1bCB7IGxpc3Qtc3R5bGUtdHlwZTogZGlzYzsgfVxuICBvbCB7IGxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsgfVxuXG4gIGxpIHtcbiAgICBsaW5lLWhlaWdodDogMS42NTtcbiAgICArIGxpIHsgbWFyZ2luLXRvcDogMC4yNWVtOyB9XG4gICAgcCB7IG1hcmdpbjogMDsgfVxuICB9XG59XG5cbi8vIEV4cG9ydGVkIGNsYXNzIGZvciB1c2UgaW4gcHJldmlldyBkaXZzIG91dHNpZGUgdGhlIGVkaXRvci5cbi5wcm9zZSB7XG4gIEBpbmNsdWRlIHByb3NlO1xuICBwYWRkaW5nOiB2YXIoLS1zcGFjaW5nLTMpIHZhcigtLXNwYWNpbmctNCk7XG59XG5cbi8vIOKUgOKUgOKUgCBFZGl0b3IgY29udGVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLmVkaXRvckNvbnRlbnQge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1ydGUtbWF4LWhlaWdodCk7XG4gIHNjcm9sbGJhci13aWR0aDogdGhpbjtcbiAgc2Nyb2xsYmFyLWNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTIwMCkgdHJhbnNwYXJlbnQ7XG5cbiAgJjo6LXdlYmtpdC1zY3JvbGxiYXIgeyB3aWR0aDogNHB4OyB9XG4gICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IH1cbiAgJjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtZnVsbCk7XG4gIH1cblxuICAmOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IHN0aWNreTtcbiAgICB0b3A6IDA7XG4gICAgLy8gaGVpZ2h0OiAzNnB4O1xuICAgIC8vIG1hcmdpbi1ib3R0b206IC0zNnB4O1xuICAgIC8vIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHZhcigtLWNvbG9yLXN1cmZhY2UpIDAlLCB0cmFuc3BhcmVudCAxMDAlKTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB6LWluZGV4OiA5O1xuICB9XG5cbiAgOmdsb2JhbCguUHJvc2VNaXJyb3IpIHtcbiAgICBAaW5jbHVkZSBwcm9zZTtcbiAgICBtaW4taGVpZ2h0OiB2YXIoLS1ydGUtbWluLWhlaWdodCwgMjAwcHgpO1xuICAgIHBhZGRpbmc6IHZhcigtLXNwYWNpbmctMykgdmFyKC0tc3BhY2luZy00KTtcbiAgICBvdXRsaW5lOiBub25lO1xuICAgIGNhcmV0LWNvbG9yOiB2YXIoLS1yaWNoLXRleHQtZWRpdG9yLWFjY2VudCwgdmFyKC0tYWNjZW50KSk7XG5cbiAgICBwLmlzLWVtcHR5OmZpcnN0LWNoaWxkOjpiZWZvcmUge1xuICAgICAgY29udGVudDogYXR0cihkYXRhLXBsYWNlaG9sZGVyKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1jb2xvci1uZXV0cmFsLTQwMCk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIGZsb2F0OiBsZWZ0O1xuICAgICAgaGVpZ2h0OiAwO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBQYWdlIGJyZWFrIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGRpdltkYXRhLXR5cGU9XCJwYWdlLWJyZWFrXCJdIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG1hcmdpbjogMWVtIDA7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBoZWlnaHQ6IDA7XG4gICAgICBib3JkZXItdG9wOiAycHggZGFzaGVkIHZhcigtLWNvbG9yLW5ldXRyYWwtMjAwKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG5cbiAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCJQYWdlIGJyZWFrXCI7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIHBhZGRpbmc6IDAgdmFyKC0tc3BhY2luZy0yKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tY29sb3Itc3VyZmFjZSk7XG4gICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLXhzKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWNvbG9yLW5ldXRyYWwtNDAwKTtcbiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtZmFtaWx5LWJhc2UpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgfVxuICAgIH1cblxuICAgIDo6c2VsZWN0aW9uIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXJpY2gtdGV4dC1lZGl0b3ItYWNjZW50LWxpZ2h0LCB2YXIoLS1hY2NlbnQtbGlnaHQpKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ== */","import React, { useEffect, useState, useRef } from \"react\";\nimport { EditorProvider, useCurrentEditor } from \"@tiptap/react\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport type { JSONContent, Extensions } from \"@tiptap/core\";\nimport styles from \"./RichTextEditor.module.scss\";\nimport { deriveAccent, accentToCssVars } from \"../../utils/color\";\n\nexport { useCurrentEditor } from \"@tiptap/react\";\n\nexport interface RichTextEditorProps {\n value?: string;\n placeholder?: string;\n readOnly?: boolean;\n minHeight?: string | number;\n maxHeight?: string | number;\n accent?: string;\n extensions?: Extensions;\n /** Rendered inside the toolbar, after the built-in buttons. Use with useCurrentEditor(). */\n slotBefore?: React.ReactNode;\n /** Rendered below the editor area. Use with useCurrentEditor(). */\n slotAfter?: React.ReactNode;\n onChangeHTML?: (html: string) => void;\n onChangeJSON?: (json: JSONContent) => void;\n}\n\ntype HeadingLevel = 1 | 2 | 3;\n\nconst BulletListIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"2.5\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" />\n <line x1=\"6\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"2.5\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\n <line x1=\"6\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"2.5\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <line x1=\"6\" y1=\"12\" x2=\"14\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst OrderedListIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <text x=\"0.5\" y=\"5.5\" fontSize=\"5.5\" fill=\"currentColor\" fontFamily=\"system-ui, sans-serif\">1.</text>\n <line x1=\"7\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <text x=\"0.5\" y=\"9.5\" fontSize=\"5.5\" fill=\"currentColor\" fontFamily=\"system-ui, sans-serif\">2.</text>\n <line x1=\"7\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <text x=\"0.5\" y=\"13.5\" fontSize=\"5.5\" fill=\"currentColor\" fontFamily=\"system-ui, sans-serif\">3.</text>\n <line x1=\"7\" y1=\"12\" x2=\"14\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst Toolbar: React.FC<{ slotBefore?: React.ReactNode }> = ({ slotBefore }) => {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n return (\n <div className={styles.toolbar} role=\"toolbar\" aria-label=\"Text formatting\">\n <div className={styles.toolbarGroup}>\n {(\n [\n { render: () => <strong>B</strong>, title: \"Bold\", action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive(\"bold\") },\n { render: () => <em>I</em>, title: \"Italic\", action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive(\"italic\") },\n { render: () => <u>U</u>, title: \"Underline\", action: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive(\"underline\") },\n { render: () => <s>S</s>, title: \"Strikethrough\", action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive(\"strike\") },\n ] as const\n ).map(({ render, title, action, active }) => (\n <button\n key={title}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); action(); }}\n >\n {render()}\n </button>\n ))}\n </div>\n <div className={styles.divider} aria-hidden=\"true\" />\n <div className={styles.toolbarGroup}>\n {([1, 2, 3] as HeadingLevel[]).map((level) => (\n <button\n key={`h${level}`}\n type=\"button\"\n title={`Heading ${level}`}\n aria-label={`Heading ${level}`}\n aria-pressed={editor.isActive(\"heading\", { level })}\n className={[\n styles.toolbarButton,\n styles.headingButton,\n editor.isActive(\"heading\", { level }) ? styles.active : \"\",\n ].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); editor.chain().focus().toggleHeading({ level }).run(); }}\n >\n H{level}\n </button>\n ))}\n </div>\n <div className={styles.divider} aria-hidden=\"true\" />\n <div className={styles.toolbarGroup}>\n {(\n [\n { icon: <BulletListIcon />, title: \"Bullet list\", action: () => editor.chain().focus().toggleBulletList().run(), active: editor.isActive(\"bulletList\") },\n { icon: <OrderedListIcon />, title: \"Ordered list\", action: () => editor.chain().focus().toggleOrderedList().run(), active: editor.isActive(\"orderedList\") },\n ] as const\n ).map(({ icon, title, action, active }) => (\n <button\n key={title}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); action(); }}\n >\n {icon}\n </button>\n ))}\n </div>\n {slotBefore && (\n <>\n <div className={styles.divider} aria-hidden=\"true\" />\n <div className={styles.toolbarGroup}>{slotBefore}</div>\n </>\n )}\n </div>\n );\n};\n\nconst BubbleMenu: React.FC = () => {\n const { editor } = useCurrentEditor();\n const menuRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ x: number; y: number; flip: boolean } | null>(null);\n\n useEffect(() => {\n if (!editor) return;\n\n const update = () => {\n const { selection } = editor.state;\n if (selection.empty) { setPos(null); return; }\n const { from, to } = selection;\n const start = editor.view.coordsAtPos(from);\n const end = editor.view.coordsAtPos(to);\n const halfW = (menuRef.current?.offsetWidth ?? 0) / 2;\n const menuH = menuRef.current?.offsetHeight ?? 0;\n const rawX = (start.left + end.left) / 2;\n const clampedX = Math.max(halfW + 8, Math.min(rawX, window.innerWidth - halfW - 8));\n const toolbarBottom = document.querySelector(\"[role='toolbar']\")?.getBoundingClientRect().bottom ?? 0;\n const flip = start.top - menuH - 8 < toolbarBottom + 8;\n setPos({ x: clampedX, y: flip ? start.bottom : start.top, flip });\n };\n\n editor.on(\"selectionUpdate\", update);\n editor.on(\"blur\", () => setPos(null));\n return () => {\n editor.off(\"selectionUpdate\", update);\n editor.off(\"blur\", () => setPos(null));\n };\n }, [editor]);\n\n if (!editor) return null;\n\n const visible = pos !== null;\n\n return (\n <div\n ref={menuRef}\n className={styles.bubbleMenu}\n aria-hidden={!visible}\n style={{\n position: \"fixed\",\n left: pos?.x ?? 0,\n top: pos?.y ?? 0,\n transform: pos?.flip\n ? \"translate(-50%, 8px)\"\n : \"translate(-50%, calc(-100% - 8px))\",\n zIndex: 50,\n visibility: visible ? \"visible\" : \"hidden\",\n pointerEvents: visible ? \"auto\" : \"none\",\n }}\n >\n {(\n [\n { render: () => <strong>B</strong>, title: \"Bold\", action: () => editor.chain().focus().toggleBold().run(), active: editor.isActive(\"bold\") },\n { render: () => <em>I</em>, title: \"Italic\", action: () => editor.chain().focus().toggleItalic().run(), active: editor.isActive(\"italic\") },\n { render: () => <u>U</u>, title: \"Underline\", action: () => editor.chain().focus().toggleUnderline().run(), active: editor.isActive(\"underline\") },\n { render: () => <s>S</s>, title: \"Strikethrough\", action: () => editor.chain().focus().toggleStrike().run(), active: editor.isActive(\"strike\") },\n ] as const\n ).map(({ render, title, action, active }) => (\n <button\n key={title}\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => { e.preventDefault(); action(); }}\n >\n {render()}\n </button>\n ))}\n </div>\n );\n};\n\nexport const RichTextEditor: React.FC<RichTextEditorProps> = ({\n value,\n placeholder = \"Start writing...\",\n readOnly = false,\n minHeight = 200,\n maxHeight,\n accent,\n extensions = [],\n slotBefore,\n slotAfter,\n onChangeHTML,\n onChangeJSON,\n}) => {\n const accentVars = accent\n ? accentToCssVars(deriveAccent(accent), \"rich-text-editor\")\n : {};\n const minHeightValue = typeof minHeight === \"number\" ? `${minHeight}px` : minHeight;\n const maxHeightValue = maxHeight !== undefined\n ? (typeof maxHeight === \"number\" ? `${maxHeight}px` : maxHeight)\n : undefined;\n\n return (\n <div\n className={[styles.root, readOnly ? styles.readOnly : \"\"].filter(Boolean).join(\" \")}\n style={{ ...accentVars, \"--rte-min-height\": minHeightValue, \"--rte-max-height\": maxHeightValue } as React.CSSProperties}\n >\n <EditorProvider\n extensions={[\n StarterKit.configure({ heading: { levels: [1, 2, 3] } }),\n Underline,\n Placeholder.configure({ placeholder }),\n ...extensions,\n ]}\n content={value}\n editable={!readOnly}\n onUpdate={({ editor }) => {\n onChangeHTML?.(editor.getHTML());\n onChangeJSON?.(editor.getJSON());\n }}\n slotBefore={!readOnly ? <Toolbar slotBefore={slotBefore} /> : undefined}\n slotAfter={slotAfter}\n editorContainerProps={{ className: styles.editorContent }}\n >\n {!readOnly && <BubbleMenu />}\n </EditorProvider>\n </div>\n );\n};\n","import type { EditorState, Transaction } from '@tiptap/pm/state'\n\n/**\n * Takes a Transaction & Editor State and turns it into a chainable state object\n * @param config The transaction and state to create the chainable state from\n * @returns A chainable Editor state object\n */\nexport function createChainableState(config: {\n transaction: Transaction\n state: EditorState\n}): EditorState {\n const { state, transaction } = config\n let { selection } = transaction\n let { doc } = transaction\n let { storedMarks } = transaction\n\n return {\n ...state,\n apply: state.apply.bind(state),\n applyTransaction: state.applyTransaction.bind(state),\n plugins: state.plugins,\n schema: state.schema,\n reconfigure: state.reconfigure.bind(state),\n toJSON: state.toJSON.bind(state),\n get storedMarks() {\n return storedMarks\n },\n get selection() {\n return selection\n },\n get doc() {\n return doc\n },\n get tr() {\n selection = transaction.selection\n doc = transaction.doc\n storedMarks = transaction.storedMarks\n\n return transaction\n },\n }\n}\n","import type { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport type { Editor } from './Editor.js'\nimport { createChainableState } from './helpers/createChainableState.js'\nimport type {\n AnyCommands,\n CanCommands,\n ChainedCommands,\n CommandProps,\n SingleCommands,\n} from './types.js'\n\nexport class CommandManager {\n editor: Editor\n\n rawCommands: AnyCommands\n\n customState?: EditorState\n\n constructor(props: { editor: Editor; state?: EditorState }) {\n this.editor = props.editor\n this.rawCommands = this.editor.extensionManager.commands\n this.customState = props.state\n }\n\n get hasCustomState(): boolean {\n return !!this.customState\n }\n\n get state(): EditorState {\n return this.customState || this.editor.state\n }\n\n get commands(): SingleCommands {\n const { rawCommands, editor, state } = this\n const { view } = editor\n const { tr } = state\n const props = this.buildProps(tr)\n\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n const method = (...args: any[]) => {\n const callback = command(...args)(props)\n\n if (!tr.getMeta('preventDispatch') && !this.hasCustomState) {\n view.dispatch(tr)\n }\n\n return callback\n }\n\n return [name, method]\n }),\n ) as unknown as SingleCommands\n }\n\n get chain(): () => ChainedCommands {\n return () => this.createChain()\n }\n\n get can(): () => CanCommands {\n return () => this.createCan()\n }\n\n public createChain(startTr?: Transaction, shouldDispatch = true): ChainedCommands {\n const { rawCommands, editor, state } = this\n const { view } = editor\n const callbacks: boolean[] = []\n const hasStartTransaction = !!startTr\n const tr = startTr || state.tr\n\n const run = () => {\n if (\n !hasStartTransaction &&\n shouldDispatch &&\n !tr.getMeta('preventDispatch') &&\n !this.hasCustomState\n ) {\n view.dispatch(tr)\n }\n\n return callbacks.every(callback => callback === true)\n }\n\n const chain = {\n ...Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n const chainedCommand = (...args: never[]) => {\n const props = this.buildProps(tr, shouldDispatch)\n const callback = command(...args)(props)\n\n callbacks.push(callback)\n\n return chain\n }\n\n return [name, chainedCommand]\n }),\n ),\n run,\n } as unknown as ChainedCommands\n\n return chain\n }\n\n public createCan(startTr?: Transaction): CanCommands {\n const { rawCommands, state } = this\n const dispatch = false\n const tr = startTr || state.tr\n const props = this.buildProps(tr, dispatch)\n const formattedCommands = Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args: never[]) => command(...args)({ ...props, dispatch: undefined })]\n }),\n ) as unknown as SingleCommands\n\n return {\n ...formattedCommands,\n chain: () => this.createChain(tr, dispatch),\n } as CanCommands\n }\n\n public buildProps(tr: Transaction, shouldDispatch = true): CommandProps {\n const { rawCommands, editor, state } = this\n const { view } = editor\n\n const props: CommandProps = {\n tr,\n editor,\n view,\n state: createChainableState({\n state,\n transaction: tr,\n }),\n dispatch: shouldDispatch ? () => undefined : undefined,\n chain: () => this.createChain(tr, shouldDispatch),\n can: () => this.createCan(tr),\n get commands() {\n return Object.fromEntries(\n Object.entries(rawCommands).map(([name, command]) => {\n return [name, (...args: never[]) => command(...args)(props)]\n }),\n ) as unknown as SingleCommands\n },\n }\n\n return props\n }\n}\n","export * from './blur.js'\nexport * from './clearContent.js'\nexport * from './clearNodes.js'\nexport * from './command.js'\nexport * from './createParagraphNear.js'\nexport * from './cut.js'\nexport * from './deleteCurrentNode.js'\nexport * from './deleteNode.js'\nexport * from './deleteRange.js'\nexport * from './deleteSelection.js'\nexport * from './enter.js'\nexport * from './exitCode.js'\nexport * from './extendMarkRange.js'\nexport * from './first.js'\nexport * from './focus.js'\nexport * from './forEach.js'\nexport * from './insertContent.js'\nexport * from './insertContentAt.js'\nexport * from './join.js'\nexport * from './joinItemBackward.js'\nexport * from './joinItemForward.js'\nexport * from './joinTextblockBackward.js'\nexport * from './joinTextblockForward.js'\nexport * from './keyboardShortcut.js'\nexport * from './lift.js'\nexport * from './liftEmptyBlock.js'\nexport * from './liftListItem.js'\nexport * from './newlineInCode.js'\nexport * from './resetAttributes.js'\nexport * from './scrollIntoView.js'\nexport * from './selectAll.js'\nexport * from './selectNodeBackward.js'\nexport * from './selectNodeForward.js'\nexport * from './selectParentNode.js'\nexport * from './selectTextblockEnd.js'\nexport * from './selectTextblockStart.js'\nexport * from './setContent.js'\nexport * from './setMark.js'\nexport * from './setMeta.js'\nexport * from './setNode.js'\nexport * from './setNodeSelection.js'\nexport * from './setTextDirection.js'\nexport * from './setTextSelection.js'\nexport * from './sinkListItem.js'\nexport * from './splitBlock.js'\nexport * from './splitListItem.js'\nexport * from './toggleList.js'\nexport * from './toggleMark.js'\nexport * from './toggleNode.js'\nexport * from './toggleWrap.js'\nexport * from './undoInputRule.js'\nexport * from './unsetAllMarks.js'\nexport * from './unsetMark.js'\nexport * from './unsetTextDirection.js'\nexport * from './updateAttributes.js'\nexport * from './wrapIn.js'\nexport * from './wrapInList.js'\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n blur: {\n /**\n * Removes focus from the editor.\n * @example editor.commands.blur()\n */\n blur: () => ReturnType\n }\n }\n}\n\nexport const blur: RawCommands['blur'] =\n () =>\n ({ editor, view }) => {\n requestAnimationFrame(() => {\n if (!editor.isDestroyed) {\n ;(view.dom as HTMLElement).blur()\n\n // Browsers should remove the caret on blur but safari does not.\n // See: https://github.com/ueberdosis/tiptap/issues/2405\n window?.getSelection()?.removeAllRanges()\n }\n })\n\n return true\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n clearContent: {\n /**\n * Clear the whole document.\n * @example editor.commands.clearContent()\n */\n clearContent: (\n /**\n * Whether to emit an update event.\n * @default true\n */\n emitUpdate?: boolean,\n ) => ReturnType\n }\n }\n}\n\nexport const clearContent: RawCommands['clearContent'] =\n (emitUpdate = true) =>\n ({ commands }) => {\n return commands.setContent('', { emitUpdate })\n }\n","import { liftTarget } from '@tiptap/pm/transform'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n clearNodes: {\n /**\n * Normalize nodes to a simple paragraph.\n * @example editor.commands.clearNodes()\n */\n clearNodes: () => ReturnType\n }\n }\n}\n\nexport const clearNodes: RawCommands['clearNodes'] =\n () =>\n ({ state, tr, dispatch }) => {\n const { selection } = tr\n const { ranges } = selection\n\n if (!dispatch) {\n return true\n }\n\n ranges.forEach(({ $from, $to }) => {\n state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n if (node.type.isText) {\n return\n }\n\n const { doc, mapping } = tr\n const $mappedFrom = doc.resolve(mapping.map(pos))\n const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize))\n const nodeRange = $mappedFrom.blockRange($mappedTo)\n\n if (!nodeRange) {\n return\n }\n\n const targetLiftDepth = liftTarget(nodeRange)\n\n if (node.type.isTextblock) {\n const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index())\n\n tr.setNodeMarkup(nodeRange.start, defaultType)\n }\n\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth)\n }\n })\n })\n\n return true\n }\n","import type { Command, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n command: {\n /**\n * Define a command inline.\n * @param fn The command function.\n * @example\n * editor.commands.command(({ tr, state }) => {\n * ...\n * return true\n * })\n */\n command: (fn: (props: Parameters<Command>[0]) => boolean) => ReturnType\n }\n }\n}\n\nexport const command: RawCommands['command'] = fn => props => {\n return fn(props)\n}\n","import { createParagraphNear as originalCreateParagraphNear } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n createParagraphNear: {\n /**\n * Create a paragraph nearby.\n * @example editor.commands.createParagraphNear()\n */\n createParagraphNear: () => ReturnType\n }\n }\n}\n\nexport const createParagraphNear: RawCommands['createParagraphNear'] =\n () =>\n ({ state, dispatch }) => {\n return originalCreateParagraphNear(state, dispatch)\n }\n","import { TextSelection } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n cut: {\n /**\n * Cuts content from a range and inserts it at a given position.\n * @param range The range to cut.\n * @param range.from The start position of the range.\n * @param range.to The end position of the range.\n * @param targetPos The position to insert the content at.\n * @example editor.commands.cut({ from: 1, to: 3 }, 5)\n */\n cut: ({ from, to }: { from: number; to: number }, targetPos: number) => ReturnType\n }\n }\n}\n\nexport const cut: RawCommands['cut'] =\n (originRange, targetPos) =>\n ({ editor, tr }) => {\n const { state } = editor\n\n const contentSlice = state.doc.slice(originRange.from, originRange.to)\n\n tr.deleteRange(originRange.from, originRange.to)\n const newPos = tr.mapping.map(targetPos)\n\n tr.insert(newPos, contentSlice.content)\n\n tr.setSelection(new TextSelection(tr.doc.resolve(Math.max(newPos - 1, 0))))\n\n return true\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteCurrentNode: {\n /**\n * Delete the node that currently has the selection anchor.\n * @example editor.commands.deleteCurrentNode()\n */\n deleteCurrentNode: () => ReturnType\n }\n }\n}\n\nexport const deleteCurrentNode: RawCommands['deleteCurrentNode'] =\n () =>\n ({ tr, dispatch }) => {\n const { selection } = tr\n const currentNode = selection.$anchor.node()\n\n // if there is content inside the current node, break out of this command\n if (currentNode.content.size > 0) {\n return false\n }\n\n const $pos = tr.selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (node.type === currentNode.type) {\n if (dispatch) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n\n tr.delete(from, to).scrollIntoView()\n }\n\n return true\n }\n }\n\n return false\n }\n","import type { NodeType, Schema } from '@tiptap/pm/model'\n\nexport function getNodeType(nameOrType: string | NodeType, schema: Schema): NodeType {\n if (typeof nameOrType === 'string') {\n if (!schema.nodes[nameOrType]) {\n throw Error(\n `There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`,\n )\n }\n\n return schema.nodes[nameOrType]\n }\n\n return nameOrType\n}\n","import type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteNode: {\n /**\n * Delete a node with a given type or name.\n * @param typeOrName The type or name of the node.\n * @example editor.commands.deleteNode('paragraph')\n */\n deleteNode: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const deleteNode: RawCommands['deleteNode'] =\n typeOrName =>\n ({ tr, state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n const $pos = tr.selection.$anchor\n\n for (let depth = $pos.depth; depth > 0; depth -= 1) {\n const node = $pos.node(depth)\n\n if (node.type === type) {\n if (dispatch) {\n const from = $pos.before(depth)\n const to = $pos.after(depth)\n\n tr.delete(from, to).scrollIntoView()\n }\n\n return true\n }\n }\n\n return false\n }\n","import type { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteRange: {\n /**\n * Delete a given range.\n * @param range The range to delete.\n * @example editor.commands.deleteRange({ from: 1, to: 3 })\n */\n deleteRange: (range: Range) => ReturnType\n }\n }\n}\n\nexport const deleteRange: RawCommands['deleteRange'] =\n range =>\n ({ tr, dispatch }) => {\n const { from, to } = range\n\n if (dispatch) {\n tr.delete(from, to)\n }\n\n return true\n }\n","import type { ResolvedPos, Schema } from '@tiptap/pm/model'\n\nimport type { RawCommands } from '../types.js'\n\n/**\n * Check if a node has text content based on its content specification.\n * Returns true if the node's content spec matches text* or text+ patterns.\n */\nconst hasTextContent = (nodeSpec: { content?: string }): boolean => {\n if (!nodeSpec.content) {\n return false\n }\n const textRegex = /^text(\\*|\\+)/\n return textRegex.test(nodeSpec.content)\n}\n\n/**\n * Expand selection position for a specific side (left or right) to handle inline text nodes.\n * This function checks if the position is within an inline node with text content and\n * expands it to include the entire node boundaries for proper deletion.\n * @param $pos - The resolved position to expand\n * @param schema - The ProseMirror schema\n * @param side - Which side to expand ('left' or 'right')\n * @returns The expanded position for deletion\n */\nconst expandSelectionForSide = (\n $pos: ResolvedPos,\n schema: Schema,\n side: 'left' | 'right',\n): number => {\n if (!$pos.parent.isInline) {\n return $pos.pos\n }\n\n if ((side === 'left' && $pos.pos > $pos.start()) || (side === 'right' && $pos.pos < $pos.end())) {\n return $pos.pos\n }\n\n const parentContent = schema.nodes[$pos.parent.type.name].spec\n if (!hasTextContent(parentContent)) {\n return $pos.pos\n }\n\n return side === 'left' ? $pos.start() - 1 : $pos.end() + 1\n}\n\n/**\n * Expand selection range to properly handle deletion of inline text nodes.\n * Inline text nodes don't collapse correctly when text inside is deleted,\n * so we need to expand the selection to include the entire node.\n * See: https://code.haverbeke.berlin/prosemirror/prosemirror/issues/1365\n */\nconst expandSelectionForInlineText = (\n $from: ResolvedPos,\n $to: ResolvedPos,\n schema: Schema,\n): { from: number; to: number } => {\n const from = expandSelectionForSide($from, schema, 'left')\n const to = expandSelectionForSide($to, schema, 'right')\n\n return { from, to }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n deleteSelection: {\n /**\n * Delete the selection, if there is one.\n * @example editor.commands.deleteSelection()\n */\n deleteSelection: () => ReturnType\n }\n }\n}\n\nexport const deleteSelection: RawCommands['deleteSelection'] =\n () =>\n ({ state, dispatch }) => {\n const { $from, $to } = state.selection\n if (state.selection.empty) {\n return false\n }\n\n const { from, to } = expandSelectionForInlineText($from, $to, state.schema)\n\n if (dispatch) {\n state.tr.deleteRange(from, to).scrollIntoView()\n dispatch(state.tr)\n }\n\n return true\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n enter: {\n /**\n * Trigger enter.\n * @example editor.commands.enter()\n */\n enter: () => ReturnType\n }\n }\n}\n\nexport const enter: RawCommands['enter'] =\n () =>\n ({ commands }) => {\n return commands.keyboardShortcut('Enter')\n }\n","import { exitCode as originalExitCode } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n exitCode: {\n /**\n * Exit from a code block.\n * @example editor.commands.exitCode()\n */\n exitCode: () => ReturnType\n }\n }\n}\n\nexport const exitCode: RawCommands['exitCode'] =\n () =>\n ({ state, dispatch }) => {\n return originalExitCode(state, dispatch)\n }\n","export function isRegExp(value: any): value is RegExp {\n return Object.prototype.toString.call(value) === '[object RegExp]'\n}\n","import { isRegExp } from './isRegExp.js'\n\n/**\n * Check if object1 includes object2\n * @param object1 Object\n * @param object2 Object\n */\nexport function objectIncludes(\n object1: Record<string, any>,\n object2: Record<string, any>,\n options: { strict: boolean } = { strict: true },\n): boolean {\n const keys = Object.keys(object2)\n\n if (!keys.length) {\n return true\n }\n\n return keys.every(key => {\n if (options.strict) {\n return object2[key] === object1[key]\n }\n\n if (isRegExp(object2[key])) {\n return object2[key].test(object1[key])\n }\n\n return object2[key] === object1[key]\n })\n}\n","import type { Mark as ProseMirrorMark, MarkType, ResolvedPos } from '@tiptap/pm/model'\n\nimport type { Range } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\n\nfunction findMarkInSet(\n marks: ProseMirrorMark[],\n type: MarkType,\n attributes: Record<string, any> = {},\n): ProseMirrorMark | undefined {\n return marks.find(item => {\n return (\n item.type === type &&\n objectIncludes(\n // Only check equality for the attributes that are provided\n Object.fromEntries(Object.keys(attributes).map(k => [k, item.attrs[k]])),\n attributes,\n )\n )\n })\n}\n\nfunction isMarkInSet(\n marks: ProseMirrorMark[],\n type: MarkType,\n attributes: Record<string, any> = {},\n): boolean {\n return !!findMarkInSet(marks, type, attributes)\n}\n\n/**\n * Get the range of a mark at a resolved position.\n */\nexport function getMarkRange(\n /**\n * The position to get the mark range for.\n */\n $pos: ResolvedPos,\n /**\n * The mark type to get the range for.\n */\n type: MarkType,\n /**\n * The attributes to match against.\n * If not provided, only the first mark at the position will be matched.\n */\n attributes?: Record<string, any>,\n): Range | void {\n if (!$pos || !type) {\n return\n }\n let start = $pos.parent.childAfter($pos.parentOffset)\n\n // If the cursor is at the start of a text node that does not have the mark, look backward\n if (!start.node || !start.node.marks.some(mark => mark.type === type)) {\n start = $pos.parent.childBefore($pos.parentOffset)\n }\n\n // If there is no text node with the mark even backward, return undefined\n if (!start.node || !start.node.marks.some(mark => mark.type === type)) {\n return\n }\n\n // Default to only matching against the attributes of the first mark with the given type\n if (!attributes) {\n const firstMark = start.node.marks.find(mark => mark.type === type)\n if (firstMark) {\n attributes = firstMark.attrs\n }\n }\n\n // We now know that the cursor is either at the start, middle or end of a text node with the specified mark\n // so we can look it up on the targeted mark\n const mark = findMarkInSet([...start.node.marks], type, attributes)\n\n if (!mark) {\n return\n }\n\n let startIndex = start.index\n let startPos = $pos.start() + start.offset\n let endIndex = startIndex + 1\n let endPos = startPos + start.node.nodeSize\n\n while (\n startIndex > 0 &&\n isMarkInSet([...$pos.parent.child(startIndex - 1).marks], type, attributes)\n ) {\n startIndex -= 1\n startPos -= $pos.parent.child(startIndex).nodeSize\n }\n\n while (\n endIndex < $pos.parent.childCount &&\n isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)\n ) {\n endPos += $pos.parent.child(endIndex).nodeSize\n endIndex += 1\n }\n\n return {\n from: startPos,\n to: endPos,\n }\n}\n","import type { MarkType, Schema } from '@tiptap/pm/model'\n\nexport function getMarkType(nameOrType: string | MarkType, schema: Schema): MarkType {\n if (typeof nameOrType === 'string') {\n if (!schema.marks[nameOrType]) {\n throw Error(\n `There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`,\n )\n }\n\n return schema.marks[nameOrType]\n }\n\n return nameOrType\n}\n","import type { MarkType } from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\n\nimport { getMarkRange } from '../helpers/getMarkRange.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n extendMarkRange: {\n /**\n * Extends the text selection to the current mark by type or name.\n * @param typeOrName The type or name of the mark.\n * @param attributes The attributes to match against.\n * If not provided, only the first mark at the position will be matched.\n * @example editor.commands.extendMarkRange('bold')\n * @example editor.commands.extendMarkRange('mention', { userId: \"1\" })\n */\n extendMarkRange: (\n /**\n * The type or name of the mark.\n */\n typeOrName: string | MarkType,\n\n /**\n * The attributes of the mark.\n */\n attributes?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const extendMarkRange: RawCommands['extendMarkRange'] =\n (typeOrName, attributes) =>\n ({ tr, state, dispatch }) => {\n const type = getMarkType(typeOrName, state.schema)\n const { doc, selection } = tr\n const { $from, from, to } = selection\n\n if (dispatch) {\n const range = getMarkRange($from, type, attributes)\n\n if (range && range.from <= from && range.to >= to) {\n const newSelection = TextSelection.create(doc, range.from, range.to)\n\n tr.setSelection(newSelection)\n }\n }\n\n return true\n }\n","import type { Command, CommandProps, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n first: {\n /**\n * Runs one command after the other and stops at the first which returns true.\n * @param commands The commands to run.\n * @example editor.commands.first([command1, command2])\n */\n first: (commands: Command[] | ((props: CommandProps) => Command[])) => ReturnType\n }\n }\n}\n\nexport const first: RawCommands['first'] = commands => props => {\n const items = typeof commands === 'function' ? commands(props) : commands\n\n for (let i = 0; i < items.length; i += 1) {\n if (items[i](props)) {\n return true\n }\n }\n\n return false\n}\n","import { TextSelection } from '@tiptap/pm/state'\n\nexport function isTextSelection(value: unknown): value is TextSelection {\n return value instanceof TextSelection\n}\n","export function minMax(value = 0, min = 0, max = 0): number {\n return Math.min(Math.max(value, min), max)\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport { Selection, TextSelection } from '@tiptap/pm/state'\n\nimport type { FocusPosition } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\nexport function resolveFocusPosition(\n doc: ProseMirrorNode,\n position: FocusPosition = null,\n): Selection | null {\n if (!position) {\n return null\n }\n\n const selectionAtStart = Selection.atStart(doc)\n const selectionAtEnd = Selection.atEnd(doc)\n\n if (position === 'start' || position === true) {\n return selectionAtStart\n }\n\n if (position === 'end') {\n return selectionAtEnd\n }\n\n const minPos = selectionAtStart.from\n const maxPos = selectionAtEnd.to\n\n if (position === 'all') {\n return TextSelection.create(\n doc,\n minMax(0, minPos, maxPos),\n minMax(doc.content.size, minPos, maxPos),\n )\n }\n\n return TextSelection.create(\n doc,\n minMax(position, minPos, maxPos),\n minMax(position, minPos, maxPos),\n )\n}\n","export function isAndroid(): boolean {\n return navigator.platform === 'Android' || /android/i.test(navigator.userAgent)\n}\n","export function isiOS(): boolean {\n return (\n ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform,\n ) ||\n // iPad on iOS 13 detection\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document)\n )\n}\n","/**\n * Detects if the current browser is Safari (but not iOS Safari or Chrome).\n * @returns `true` if the browser is Safari, `false` otherwise.\n * @example\n * if (isSafari()) {\n * // Safari-specific handling\n * }\n */\nexport function isSafari(): boolean {\n return typeof navigator !== 'undefined'\n ? /^((?!chrome|android).)*safari/i.test(navigator.userAgent)\n : false\n}\n","import { isTextSelection } from '../helpers/isTextSelection.js'\nimport { resolveFocusPosition } from '../helpers/resolveFocusPosition.js'\nimport type { FocusPosition, RawCommands } from '../types.js'\nimport { isAndroid } from '../utilities/isAndroid.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isSafari } from '../utilities/isSafari.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n focus: {\n /**\n * Focus the editor at the given position.\n * @param position The position to focus at.\n * @param options.scrollIntoView Scroll the focused position into view after focusing\n * @example editor.commands.focus()\n * @example editor.commands.focus(32, { scrollIntoView: false })\n */\n focus: (\n /**\n * The position to focus at.\n */\n position?: FocusPosition,\n\n /**\n * Optional options\n * @default { scrollIntoView: true }\n */\n options?: {\n scrollIntoView?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const focus: RawCommands['focus'] =\n (position = null, options = {}) =>\n ({ editor, view, tr, dispatch }) => {\n options = {\n scrollIntoView: true,\n ...options,\n }\n\n const delayedFocus = () => {\n // focus within `requestAnimationFrame` breaks focus on iOS and Android\n // so we have to call this\n if (isiOS() || isAndroid()) {\n ;(view.dom as HTMLElement).focus()\n }\n\n // Safari requires preventScroll to avoid the browser scrolling to the\n // top of the editor when focus is called before the selection is set.\n // We exclude iOS and Android since they are already handled above.\n // see: https://github.com/ueberdosis/tiptap/issues/7318\n if (isSafari() && !isiOS() && !isAndroid()) {\n ;(view.dom as HTMLElement).focus({ preventScroll: true })\n }\n\n // For React we have to focus asynchronously. Otherwise wild things happen.\n // see: https://github.com/ueberdosis/tiptap/issues/1520\n requestAnimationFrame(() => {\n if (!editor.isDestroyed) {\n view.focus()\n\n if (options?.scrollIntoView) {\n editor.commands.scrollIntoView()\n }\n }\n })\n }\n\n try {\n if ((view.hasFocus() && position === null) || position === false) {\n return true\n }\n } catch {\n // if view.hasFocus fails (view not mounted yet)\n // we will return false because there's nothing to focus\n return false\n }\n\n // we don’t try to resolve a NodeSelection or CellSelection\n if (dispatch && position === null && !isTextSelection(editor.state.selection)) {\n delayedFocus()\n return true\n }\n\n // pass through tr.doc instead of editor.state.doc\n // since transactions could change the editors state before this command has been run\n const selection = resolveFocusPosition(tr.doc, position) || editor.state.selection\n const isSameSelection = editor.state.selection.eq(selection)\n\n if (dispatch) {\n if (!isSameSelection) {\n tr.setSelection(selection)\n }\n\n // `tr.setSelection` resets the stored marks\n // so we’ll restore them if the selection is the same as before\n if (isSameSelection && tr.storedMarks) {\n tr.setStoredMarks(tr.storedMarks)\n }\n\n delayedFocus()\n }\n\n return true\n }\n","import type { CommandProps, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n forEach: {\n /**\n * Loop through an array of items.\n */\n forEach: <T>(\n items: T[],\n fn: (\n item: T,\n props: CommandProps & {\n index: number\n },\n ) => boolean,\n ) => ReturnType\n }\n }\n}\n\nexport const forEach: RawCommands['forEach'] = (items, fn) => props => {\n return items.every((item, index) => fn(item, { ...props, index }))\n}\n","import type { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\n\nimport type { Content, RawCommands } from '../types.js'\n\nexport interface InsertContentOptions {\n /**\n * Options for parsing the content.\n */\n parseOptions?: ParseOptions\n\n /**\n * Whether to update the selection after inserting the content.\n */\n updateSelection?: boolean\n applyInputRules?: boolean\n applyPasteRules?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n insertContent: {\n /**\n * Insert a node or string of HTML at the current position.\n * @example editor.commands.insertContent('<h1>Example</h1>')\n * @example editor.commands.insertContent('<h1>Example</h1>', { updateSelection: false })\n */\n insertContent: (\n /**\n * The ProseMirror content to insert.\n */\n value: Content | ProseMirrorNode | Fragment,\n\n /**\n * Optional options\n */\n options?: InsertContentOptions,\n ) => ReturnType\n }\n }\n}\n\nexport const insertContent: RawCommands['insertContent'] =\n (value, options) =>\n ({ tr, commands }) => {\n return commands.insertContentAt(\n { from: tr.selection.from, to: tr.selection.to },\n value,\n options,\n )\n }\n","const removeWhitespaces = (node: HTMLElement) => {\n const children = node.childNodes\n\n for (let i = children.length - 1; i >= 0; i -= 1) {\n const child = children[i]\n\n if (child.nodeType === 3 && child.nodeValue && /^(\\n\\s\\s|\\n)$/.test(child.nodeValue)) {\n node.removeChild(child)\n } else if (child.nodeType === 1) {\n removeWhitespaces(child as HTMLElement)\n }\n }\n\n return node\n}\n\nexport function elementFromString(value: string): HTMLElement {\n if (typeof window === 'undefined') {\n throw new Error(\n '[tiptap error]: there is no window object available, so this function cannot be used',\n )\n }\n // add a wrapper to preserve leading and trailing whitespace\n const wrappedValue = `<body>${value}</body>`\n\n const html = new window.DOMParser().parseFromString(wrappedValue, 'text/html').body\n\n return removeWhitespaces(html)\n}\n","import type { ParseOptions } from '@tiptap/pm/model'\nimport { DOMParser, Fragment, Node as ProseMirrorNode, Schema } from '@tiptap/pm/model'\n\nimport type { Content } from '../types.js'\nimport { elementFromString } from '../utilities/elementFromString.js'\n\nexport type CreateNodeFromContentOptions = {\n slice?: boolean\n parseOptions?: ParseOptions\n errorOnInvalidContent?: boolean\n}\n\n/**\n * Takes a JSON or HTML content and creates a Prosemirror node or fragment from it.\n * @param content The JSON or HTML content to create the node from\n * @param schema The Prosemirror schema to use for the node\n * @param options Options for the parser\n * @returns The created Prosemirror node or fragment\n */\nexport function createNodeFromContent(\n content: Content | ProseMirrorNode | Fragment,\n schema: Schema,\n options?: CreateNodeFromContentOptions,\n): ProseMirrorNode | Fragment {\n if (content instanceof ProseMirrorNode || content instanceof Fragment) {\n return content\n }\n options = {\n slice: true,\n parseOptions: {},\n ...options,\n }\n\n const isJSONContent = typeof content === 'object' && content !== null\n const isTextContent = typeof content === 'string'\n\n if (isJSONContent) {\n try {\n const isArrayContent = Array.isArray(content) && content.length > 0\n\n // if the JSON Content is an array of nodes, create a fragment for each node\n if (isArrayContent) {\n return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)))\n }\n\n const node = schema.nodeFromJSON(content)\n\n if (options.errorOnInvalidContent) {\n node.check()\n }\n\n return node\n } catch (error) {\n if (options.errorOnInvalidContent) {\n throw new Error('[tiptap error]: Invalid JSON content', { cause: error as Error })\n }\n\n console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error)\n\n return createNodeFromContent('', schema, options)\n }\n }\n\n if (isTextContent) {\n // Check for invalid content\n if (options.errorOnInvalidContent) {\n let hasInvalidContent = false\n let invalidContent = ''\n\n // A copy of the current schema with a catch-all node at the end\n const contentCheckSchema = new Schema({\n topNode: schema.spec.topNode,\n marks: schema.spec.marks,\n // Prosemirror's schemas are executed such that: the last to execute, matches last\n // This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle\n nodes: schema.spec.nodes.append({\n __tiptap__private__unknown__catch__all__node: {\n content: 'inline*',\n group: 'block',\n parseDOM: [\n {\n tag: '*',\n getAttrs: e => {\n // If this is ever called, we know that the content has something that we don't know how to handle in the schema\n hasInvalidContent = true\n // Try to stringify the element for a more helpful error message\n invalidContent = typeof e === 'string' ? e : e.outerHTML\n return null\n },\n },\n ],\n },\n }),\n })\n\n if (options.slice) {\n DOMParser.fromSchema(contentCheckSchema).parseSlice(\n elementFromString(content),\n options.parseOptions,\n )\n } else {\n DOMParser.fromSchema(contentCheckSchema).parse(\n elementFromString(content),\n options.parseOptions,\n )\n }\n\n if (options.errorOnInvalidContent && hasInvalidContent) {\n throw new Error('[tiptap error]: Invalid HTML content', {\n cause: new Error(`Invalid element found: ${invalidContent}`),\n })\n }\n }\n\n const parser = DOMParser.fromSchema(schema)\n\n if (options.slice) {\n return parser.parseSlice(elementFromString(content), options.parseOptions).content\n }\n\n return parser.parse(elementFromString(content), options.parseOptions)\n }\n\n return createNodeFromContent('', schema, options)\n}\n","import type { Transaction } from '@tiptap/pm/state'\nimport { Selection } from '@tiptap/pm/state'\nimport { ReplaceAroundStep, ReplaceStep } from '@tiptap/pm/transform'\n\n// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466\nexport function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {\n const last = tr.steps.length - 1\n\n if (last < startLen) {\n return\n }\n\n const step = tr.steps[last]\n\n if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\n return\n }\n\n const map = tr.mapping.maps[last]\n let end = 0\n\n map.forEach((_from, _to, _newFrom, newTo) => {\n if (end === 0) {\n end = newTo\n }\n })\n\n tr.setSelection(Selection.near(tr.doc.resolve(end), bias))\n}\n","import type { Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\nimport { Fragment } from '@tiptap/pm/model'\n\nimport { createNodeFromContent } from '../helpers/createNodeFromContent.js'\nimport { selectionToInsertionEnd } from '../helpers/selectionToInsertionEnd.js'\nimport type { Content, Range, RawCommands } from '../types.js'\n\nexport interface InsertContentAtOptions {\n /**\n * Options for parsing the content.\n */\n parseOptions?: ParseOptions\n\n /**\n * Whether to update the selection after inserting the content.\n */\n updateSelection?: boolean\n\n /**\n * Whether to apply input rules after inserting the content.\n */\n applyInputRules?: boolean\n\n /**\n * Whether to apply paste rules after inserting the content.\n */\n applyPasteRules?: boolean\n\n /**\n * Whether to throw an error if the content is invalid.\n */\n errorOnInvalidContent?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n insertContentAt: {\n /**\n * Insert a node or string of HTML at a specific position.\n * @example editor.commands.insertContentAt(0, '<h1>Example</h1>')\n */\n insertContentAt: (\n /**\n * The position to insert the content at.\n */\n position: number | Range,\n\n /**\n * The ProseMirror content to insert.\n */\n value: Content | ProseMirrorNode | Fragment,\n\n /**\n * Optional options\n */\n options?: InsertContentAtOptions,\n ) => ReturnType\n }\n }\n}\n\nconst isFragment = (nodeOrFragment: ProseMirrorNode | Fragment): nodeOrFragment is Fragment => {\n return !('type' in nodeOrFragment)\n}\n\nexport const insertContentAt: RawCommands['insertContentAt'] =\n (position, value, options) =>\n ({ tr, dispatch, editor }) => {\n if (dispatch) {\n options = {\n parseOptions: editor.options.parseOptions,\n updateSelection: true,\n applyInputRules: false,\n applyPasteRules: false,\n ...options,\n }\n\n let content: Fragment | ProseMirrorNode\n\n const emitContentError = (error: Error) => {\n editor.emit('contentError', {\n editor,\n error,\n disableCollaboration: () => {\n if (\n 'collaboration' in editor.storage &&\n typeof editor.storage.collaboration === 'object' &&\n editor.storage.collaboration\n ) {\n ;(editor.storage.collaboration as any).isDisabled = true\n }\n },\n })\n }\n\n const parseOptions: ParseOptions = {\n preserveWhitespace: 'full',\n ...options.parseOptions,\n }\n\n // If `emitContentError` is enabled, we want to check the content for errors\n // but ignore them (do not remove the invalid content from the document)\n if (\n !options.errorOnInvalidContent &&\n !editor.options.enableContentCheck &&\n editor.options.emitContentError\n ) {\n try {\n createNodeFromContent(value, editor.schema, {\n parseOptions,\n errorOnInvalidContent: true,\n })\n } catch (e) {\n emitContentError(e as Error)\n }\n }\n\n try {\n content = createNodeFromContent(value, editor.schema, {\n parseOptions,\n errorOnInvalidContent: options.errorOnInvalidContent ?? editor.options.enableContentCheck,\n })\n } catch (e) {\n emitContentError(e as Error)\n return false\n }\n\n let { from, to } =\n typeof position === 'number'\n ? { from: position, to: position }\n : { from: position.from, to: position.to }\n\n let isOnlyTextContent = true\n let isOnlyBlockContent = true\n const nodes = isFragment(content) ? content : [content]\n\n nodes.forEach(node => {\n // check if added node is valid\n node.check()\n\n isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false\n\n isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false\n })\n\n // check if we can replace the wrapping node by\n // the newly inserted content\n // example:\n // replace an empty paragraph by an inserted image\n // instead of inserting the image below the paragraph\n if (from === to && isOnlyBlockContent) {\n const { parent } = tr.doc.resolve(from)\n const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount\n\n if (isEmptyTextBlock) {\n from -= 1\n to += 1\n }\n }\n\n let newContent\n\n // if there is only plain text we have to use `insertText`\n // because this will keep the current marks\n if (isOnlyTextContent) {\n // if value is string, we can use it directly\n // otherwise if it is an array, we have to join it\n if (Array.isArray(value)) {\n newContent = value.map(v => v.text || '').join('')\n } else if (value instanceof Fragment) {\n let text = ''\n\n value.forEach(node => {\n if (node.text) {\n text += node.text\n }\n })\n\n newContent = text\n } else if (typeof value === 'object' && !!value && !!value.text) {\n newContent = value.text\n } else {\n newContent = value as string\n }\n\n tr.insertText(newContent, from, to)\n } else {\n newContent = content\n\n const $from = tr.doc.resolve(from)\n const $fromNode = $from.node()\n const fromSelectionAtStart = $from.parentOffset === 0\n const isTextSelection = $fromNode.isText || $fromNode.isTextblock\n const hasContent = $fromNode.content.size > 0\n\n if (fromSelectionAtStart && isTextSelection && hasContent && isOnlyBlockContent) {\n from = Math.max(0, from - 1)\n }\n\n tr.replaceWith(from, to, newContent)\n }\n\n // set cursor at end of inserted content\n if (options.updateSelection) {\n selectionToInsertionEnd(tr, tr.steps.length - 1, -1)\n }\n\n if (options.applyInputRules) {\n tr.setMeta('applyInputRules', { from, text: newContent })\n }\n\n if (options.applyPasteRules) {\n tr.setMeta('applyPasteRules', { from, text: newContent })\n }\n }\n\n return true\n }\n","import {\n joinBackward as originalJoinBackward,\n joinDown as originalJoinDown,\n joinForward as originalJoinForward,\n joinUp as originalJoinUp,\n} from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinUp: {\n /**\n * Join the selected block or, if there is a text selection, the closest ancestor block of the selection that can be joined, with the sibling above it.\n * @example editor.commands.joinUp()\n */\n joinUp: () => ReturnType\n }\n joinDown: {\n /**\n * Join the selected block, or the closest ancestor of the selection that can be joined, with the sibling after it.\n * @example editor.commands.joinDown()\n */\n joinDown: () => ReturnType\n }\n joinBackward: {\n /**\n * If the selection is empty and at the start of a textblock, try to reduce the distance between that block and the one before it—if there's a block directly before it that can be joined, join them.\n * If not, try to move the selected block closer to the next one in the document structure by lifting it out of its\n * parent or moving it into a parent of the previous block. Will use the view for accurate (bidi-aware) start-of-textblock detection if given.\n * @example editor.commands.joinBackward()\n */\n joinBackward: () => ReturnType\n }\n joinForward: {\n /**\n * If the selection is empty and the cursor is at the end of a textblock, try to reduce or remove the boundary between that block and the one after it,\n * either by joining them or by moving the other block closer to this one in the tree structure.\n * Will use the view for accurate start-of-textblock detection if given.\n * @example editor.commands.joinForward()\n */\n joinForward: () => ReturnType\n }\n }\n}\n\nexport const joinUp: RawCommands['joinUp'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinUp(state, dispatch)\n }\n\nexport const joinDown: RawCommands['joinDown'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinDown(state, dispatch)\n }\n\nexport const joinBackward: RawCommands['joinBackward'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinBackward(state, dispatch)\n }\n\nexport const joinForward: RawCommands['joinForward'] =\n () =>\n ({ state, dispatch }) => {\n return originalJoinForward(state, dispatch)\n }\n","import { joinPoint } from '@tiptap/pm/transform'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinItemBackward: {\n /**\n * Join two items backward.\n * @example editor.commands.joinItemBackward()\n */\n joinItemBackward: () => ReturnType\n }\n }\n}\n\nexport const joinItemBackward: RawCommands['joinItemBackward'] =\n () =>\n ({ state, dispatch, tr }) => {\n try {\n const point = joinPoint(state.doc, state.selection.$from.pos, -1)\n\n if (point === null || point === undefined) {\n return false\n }\n\n tr.join(point, 2)\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n } catch {\n return false\n }\n }\n","import { joinPoint } from '@tiptap/pm/transform'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinItemForward: {\n /**\n * Join two items Forwards.\n * @example editor.commands.joinItemForward()\n */\n joinItemForward: () => ReturnType\n }\n }\n}\n\nexport const joinItemForward: RawCommands['joinItemForward'] =\n () =>\n ({ state, dispatch, tr }) => {\n try {\n const point = joinPoint(state.doc, state.selection.$from.pos, +1)\n\n if (point === null || point === undefined) {\n return false\n }\n\n tr.join(point, 2)\n\n if (dispatch) {\n dispatch(tr)\n }\n\n return true\n } catch {\n return false\n }\n }\n","import { joinTextblockBackward as originalCommand } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinTextblockBackward: {\n /**\n * A more limited form of joinBackward that only tries to join the current textblock to the one before it, if the cursor is at the start of a textblock.\n */\n joinTextblockBackward: () => ReturnType\n }\n }\n}\n\nexport const joinTextblockBackward: RawCommands['joinTextblockBackward'] =\n () =>\n ({ state, dispatch }) => {\n return originalCommand(state, dispatch)\n }\n","import { joinTextblockForward as originalCommand } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n joinTextblockForward: {\n /**\n * A more limited form of joinForward that only tries to join the current textblock to the one after it, if the cursor is at the end of a textblock.\n */\n joinTextblockForward: () => ReturnType\n }\n }\n}\n\nexport const joinTextblockForward: RawCommands['joinTextblockForward'] =\n () =>\n ({ state, dispatch }) => {\n return originalCommand(state, dispatch)\n }\n","export function isMacOS(): boolean {\n return typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false\n}\n","import type { RawCommands } from '../types.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isMacOS } from '../utilities/isMacOS.js'\n\nfunction normalizeKeyName(name: string) {\n const parts = name.split(/-(?!$)/)\n let result = parts[parts.length - 1]\n\n if (result === 'Space') {\n result = ' '\n }\n\n let alt\n let ctrl\n let shift\n let meta\n\n for (let i = 0; i < parts.length - 1; i += 1) {\n const mod = parts[i]\n\n if (/^(cmd|meta|m)$/i.test(mod)) {\n meta = true\n } else if (/^a(lt)?$/i.test(mod)) {\n alt = true\n } else if (/^(c|ctrl|control)$/i.test(mod)) {\n ctrl = true\n } else if (/^s(hift)?$/i.test(mod)) {\n shift = true\n } else if (/^mod$/i.test(mod)) {\n if (isiOS() || isMacOS()) {\n meta = true\n } else {\n ctrl = true\n }\n } else {\n throw new Error(`Unrecognized modifier name: ${mod}`)\n }\n }\n\n if (alt) {\n result = `Alt-${result}`\n }\n\n if (ctrl) {\n result = `Ctrl-${result}`\n }\n\n if (meta) {\n result = `Meta-${result}`\n }\n\n if (shift) {\n result = `Shift-${result}`\n }\n\n return result\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n keyboardShortcut: {\n /**\n * Trigger a keyboard shortcut.\n * @param name The name of the keyboard shortcut.\n * @example editor.commands.keyboardShortcut('Mod-b')\n */\n keyboardShortcut: (name: string) => ReturnType\n }\n }\n}\n\nexport const keyboardShortcut: RawCommands['keyboardShortcut'] =\n name =>\n ({ editor, view, tr, dispatch }) => {\n const keys = normalizeKeyName(name).split(/-(?!$)/)\n const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item))\n const event = new KeyboardEvent('keydown', {\n key: key === 'Space' ? ' ' : key,\n altKey: keys.includes('Alt'),\n ctrlKey: keys.includes('Ctrl'),\n metaKey: keys.includes('Meta'),\n shiftKey: keys.includes('Shift'),\n bubbles: true,\n cancelable: true,\n })\n\n const capturedTransaction = editor.captureTransaction(() => {\n view.someProp('handleKeyDown', f => f(view, event))\n })\n\n capturedTransaction?.steps.forEach(step => {\n const newStep = step.map(tr.mapping)\n\n if (newStep && dispatch) {\n tr.maybeStep(newStep)\n }\n })\n\n return true\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport type { NodeRange } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\nimport { getNodeType } from './getNodeType.js'\n\nexport function isNodeActive(\n state: EditorState,\n typeOrName: NodeType | string | null,\n attributes: Record<string, any> = {},\n): boolean {\n const { from, to, empty } = state.selection\n const type = typeOrName ? getNodeType(typeOrName, state.schema) : null\n\n const nodeRanges: NodeRange[] = []\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n const relativeFrom = Math.max(from, pos)\n const relativeTo = Math.min(to, pos + node.nodeSize)\n\n nodeRanges.push({\n node,\n from: relativeFrom,\n to: relativeTo,\n })\n })\n\n const selectionRange = to - from\n const matchedNodeRanges = nodeRanges\n .filter(nodeRange => {\n if (!type) {\n return true\n }\n\n return type.name === nodeRange.node.type.name\n })\n .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }))\n\n if (empty) {\n return !!matchedNodeRanges.length\n }\n\n const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0)\n\n return range >= selectionRange\n}\n","import { lift as originalLift } from '@tiptap/pm/commands'\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n lift: {\n /**\n * Removes an existing wrap if possible lifting the node out of it\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.lift('paragraph')\n * @example editor.commands.lift('heading', { level: 1 })\n */\n lift: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const lift: RawCommands['lift'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (!isActive) {\n return false\n }\n\n return originalLift(state, dispatch)\n }\n","import { liftEmptyBlock as originalLiftEmptyBlock } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n liftEmptyBlock: {\n /**\n * If the cursor is in an empty textblock that can be lifted, lift the block.\n * @example editor.commands.liftEmptyBlock()\n */\n liftEmptyBlock: () => ReturnType\n }\n }\n}\n\nexport const liftEmptyBlock: RawCommands['liftEmptyBlock'] =\n () =>\n ({ state, dispatch }) => {\n return originalLiftEmptyBlock(state, dispatch)\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport { liftListItem as originalLiftListItem } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n liftListItem: {\n /**\n * Create a command to lift the list item around the selection up into a wrapping list.\n * @param typeOrName The type or name of the node.\n * @example editor.commands.liftListItem('listItem')\n */\n liftListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const liftListItem: RawCommands['liftListItem'] =\n typeOrName =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalLiftListItem(type)(state, dispatch)\n }\n","import { newlineInCode as originalNewlineInCode } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n newlineInCode: {\n /**\n * Add a newline character in code.\n * @example editor.commands.newlineInCode()\n */\n newlineInCode: () => ReturnType\n }\n }\n}\n\nexport const newlineInCode: RawCommands['newlineInCode'] =\n () =>\n ({ state, dispatch }) => {\n return originalNewlineInCode(state, dispatch)\n }\n","import type { Schema } from '@tiptap/pm/model'\n\n/**\n * Get the type of a schema item by its name.\n * @param name The name of the schema item\n * @param schema The Prosemiror schema to search in\n * @returns The type of the schema item (`node` or `mark`), or null if it doesn't exist\n */\nexport function getSchemaTypeNameByName(name: string, schema: Schema): 'node' | 'mark' | null {\n if (schema.nodes[name]) {\n return 'node'\n }\n\n if (schema.marks[name]) {\n return 'mark'\n }\n\n return null\n}\n","/**\n * Remove a property or an array of properties from an object\n * @param obj Object\n * @param key Key to remove\n */\nexport function deleteProps(\n obj: Record<string, any>,\n propOrProps: string | string[],\n): Record<string, any> {\n const props = typeof propOrProps === 'string' ? [propOrProps] : propOrProps\n\n return Object.keys(obj).reduce((newObj: Record<string, any>, prop) => {\n if (!props.includes(prop)) {\n newObj[prop] = obj[prop]\n }\n\n return newObj\n }, {})\n}\n","import type { MarkType, NodeType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js'\nimport type { RawCommands } from '../types.js'\nimport { deleteProps } from '../utilities/deleteProps.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n resetAttributes: {\n /**\n * Resets some node attributes to the default value.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node to reset.\n * @example editor.commands.resetAttributes('heading', 'level')\n */\n resetAttributes: (\n typeOrName: string | NodeType | MarkType,\n attributes: string | string[],\n ) => ReturnType\n }\n }\n}\n\nexport const resetAttributes: RawCommands['resetAttributes'] =\n (typeOrName, attributes) =>\n ({ tr, state, dispatch }) => {\n let nodeType: NodeType | null = null\n let markType: MarkType | null = null\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (!schemaType) {\n return false\n }\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName as NodeType, state.schema)\n }\n\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName as MarkType, state.schema)\n }\n\n let canReset = false\n\n tr.selection.ranges.forEach(range => {\n state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n if (nodeType && nodeType === node.type) {\n canReset = true\n\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes))\n }\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach(mark => {\n if (markType === mark.type) {\n canReset = true\n\n if (dispatch) {\n tr.addMark(\n pos,\n pos + node.nodeSize,\n markType.create(deleteProps(mark.attrs, attributes)),\n )\n }\n }\n })\n }\n })\n })\n\n return canReset\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n scrollIntoView: {\n /**\n * Scroll the selection into view.\n * @example editor.commands.scrollIntoView()\n */\n scrollIntoView: () => ReturnType\n }\n }\n}\n\nexport const scrollIntoView: RawCommands['scrollIntoView'] =\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n tr.scrollIntoView()\n }\n\n return true\n }\n","import { AllSelection } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectAll: {\n /**\n * Select the whole document.\n * @example editor.commands.selectAll()\n */\n selectAll: () => ReturnType\n }\n }\n}\n\nexport const selectAll: RawCommands['selectAll'] =\n () =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const selection = new AllSelection(tr.doc)\n\n tr.setSelection(selection)\n }\n\n return true\n }\n","import { selectNodeBackward as originalSelectNodeBackward } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectNodeBackward: {\n /**\n * Select a node backward.\n * @example editor.commands.selectNodeBackward()\n */\n selectNodeBackward: () => ReturnType\n }\n }\n}\n\nexport const selectNodeBackward: RawCommands['selectNodeBackward'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectNodeBackward(state, dispatch)\n }\n","import { selectNodeForward as originalSelectNodeForward } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectNodeForward: {\n /**\n * Select a node forward.\n * @example editor.commands.selectNodeForward()\n */\n selectNodeForward: () => ReturnType\n }\n }\n}\n\nexport const selectNodeForward: RawCommands['selectNodeForward'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectNodeForward(state, dispatch)\n }\n","import { selectParentNode as originalSelectParentNode } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectParentNode: {\n /**\n * Select the parent node.\n * @example editor.commands.selectParentNode()\n */\n selectParentNode: () => ReturnType\n }\n }\n}\n\nexport const selectParentNode: RawCommands['selectParentNode'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectParentNode(state, dispatch)\n }\n","// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nimport { selectTextblockEnd as originalSelectTextblockEnd } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectTextblockEnd: {\n /**\n * Moves the cursor to the end of current text block.\n * @example editor.commands.selectTextblockEnd()\n */\n selectTextblockEnd: () => ReturnType\n }\n }\n}\n\nexport const selectTextblockEnd: RawCommands['selectTextblockEnd'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectTextblockEnd(state, dispatch)\n }\n","// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nimport { selectTextblockStart as originalSelectTextblockStart } from '@tiptap/pm/commands'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n selectTextblockStart: {\n /**\n * Moves the cursor to the start of current text block.\n * @example editor.commands.selectTextblockStart()\n */\n selectTextblockStart: () => ReturnType\n }\n }\n}\n\nexport const selectTextblockStart: RawCommands['selectTextblockStart'] =\n () =>\n ({ state, dispatch }) => {\n return originalSelectTextblockStart(state, dispatch)\n }\n","import type { Fragment, Node as ProseMirrorNode, ParseOptions, Schema } from '@tiptap/pm/model'\n\nimport type { Content } from '../types.js'\nimport { createNodeFromContent } from './createNodeFromContent.js'\n\n/**\n * Create a new Prosemirror document node from content.\n * @param content The JSON or HTML content to create the document from\n * @param schema The Prosemirror schema to use for the document\n * @param parseOptions Options for the parser\n * @returns The created Prosemirror document node\n */\nexport function createDocument(\n content: Content | ProseMirrorNode | Fragment,\n schema: Schema,\n parseOptions: ParseOptions = {},\n options: { errorOnInvalidContent?: boolean } = {},\n): ProseMirrorNode {\n return createNodeFromContent(content, schema, {\n slice: false,\n parseOptions,\n errorOnInvalidContent: options.errorOnInvalidContent,\n }) as ProseMirrorNode\n}\n","import type { Fragment, Node as ProseMirrorNode, ParseOptions } from '@tiptap/pm/model'\n\nimport { createDocument } from '../helpers/createDocument.js'\nimport type { Content, RawCommands } from '../types.js'\n\nexport interface SetContentOptions {\n /**\n * Options for parsing the content.\n * @default {}\n */\n parseOptions?: ParseOptions\n\n /**\n * Whether to throw an error if the content is invalid.\n */\n errorOnInvalidContent?: boolean\n\n /**\n * Whether to emit an update event.\n * @default true\n */\n emitUpdate?: boolean\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setContent: {\n /**\n * Replace the whole document with new content.\n * @param content The new content.\n * @param emitUpdate Whether to emit an update event.\n * @param parseOptions Options for parsing the content.\n * @example editor.commands.setContent('<p>Example text</p>')\n */\n setContent: (\n /**\n * The new content.\n */\n content: Content | Fragment | ProseMirrorNode,\n\n /**\n * Options for `setContent`.\n */\n options?: SetContentOptions,\n ) => ReturnType\n }\n }\n}\n\nexport const setContent: RawCommands['setContent'] =\n (content, { errorOnInvalidContent, emitUpdate = true, parseOptions = {} } = {}) =>\n ({ editor, tr, dispatch, commands }) => {\n const { doc } = tr\n\n // This is to keep backward compatibility with the previous behavior\n // TODO remove this in the next major version\n if (parseOptions.preserveWhitespace !== 'full') {\n const document = createDocument(content, editor.schema, parseOptions, {\n errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,\n })\n\n if (dispatch) {\n tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate)\n }\n return true\n }\n\n if (dispatch) {\n tr.setMeta('preventUpdate', !emitUpdate)\n }\n\n return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {\n parseOptions,\n errorOnInvalidContent: errorOnInvalidContent ?? editor.options.enableContentCheck,\n })\n }\n","import type { Mark, MarkType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport { getMarkType } from './getMarkType.js'\n\nexport function getMarkAttributes(\n state: EditorState,\n typeOrName: string | MarkType,\n): Record<string, any> {\n const type = getMarkType(typeOrName, state.schema)\n const { from, to, empty } = state.selection\n const marks: Mark[] = []\n\n if (empty) {\n if (state.storedMarks) {\n marks.push(...state.storedMarks)\n }\n\n marks.push(...state.selection.$head.marks())\n } else {\n state.doc.nodesBetween(from, to, node => {\n marks.push(...node.marks)\n })\n }\n\n const mark = marks.find(markItem => markItem.type.name === type.name)\n\n if (!mark) {\n return {}\n }\n\n return { ...mark.attrs }\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { Transform } from '@tiptap/pm/transform'\n\n/**\n * Returns a new `Transform` based on all steps of the passed transactions.\n * @param oldDoc The Prosemirror node to start from\n * @param transactions The transactions to combine\n * @returns A new `Transform` with all steps of the passed transactions\n */\nexport function combineTransactionSteps(\n oldDoc: ProseMirrorNode,\n transactions: Transaction[],\n): Transform {\n const transform = new Transform(oldDoc)\n\n transactions.forEach(transaction => {\n transaction.steps.forEach(step => {\n transform.step(step)\n })\n })\n\n return transform\n}\n","import type { ContentMatch, NodeType } from '@tiptap/pm/model'\n\n/**\n * Gets the default block type at a given match\n * @param match The content match to get the default block type from\n * @returns The default block type or null\n */\nexport function defaultBlockAt(match: ContentMatch): NodeType | null {\n for (let i = 0; i < match.edgeCount; i += 1) {\n const { type } = match.edge(i)\n\n if (type.isTextblock && !type.hasRequiredAttrs()) {\n return type\n }\n }\n\n return null\n}\n","import type { Node as ProseMirrorNode, ResolvedPos } from '@tiptap/pm/model'\n\nimport type { Predicate } from '../types.js'\n\n/**\n * Finds the closest parent node to a resolved position that matches a predicate.\n * @param $pos The resolved position to search from\n * @param predicate The predicate to match\n * @returns The closest parent node to the resolved position that matches the predicate\n * @example ```js\n * findParentNodeClosestToPos($from, node => node.type.name === 'paragraph')\n * ```\n */\nexport function findParentNodeClosestToPos(\n $pos: ResolvedPos,\n predicate: Predicate,\n):\n | {\n pos: number\n start: number\n depth: number\n node: ProseMirrorNode\n }\n | undefined {\n for (let i = $pos.depth; i > 0; i -= 1) {\n const node = $pos.node(i)\n\n if (predicate(node)) {\n return {\n pos: i > 0 ? $pos.before(i) : 0,\n start: $pos.start(i),\n depth: i,\n node,\n }\n }\n }\n}\n","import type { Selection } from '@tiptap/pm/state'\n\nimport type { Predicate } from '../types.js'\nimport { findParentNodeClosestToPos } from './findParentNodeClosestToPos.js'\n\n/**\n * Finds the closest parent node to the current selection that matches a predicate.\n * @param predicate The predicate to match\n * @returns A command that finds the closest parent node to the current selection that matches the predicate\n * @example ```js\n * findParentNode(node => node.type.name === 'paragraph')\n * ```\n */\nexport function findParentNode(\n predicate: Predicate,\n): (selection: Selection) => ReturnType<typeof findParentNodeClosestToPos> {\n return (selection: Selection) => findParentNodeClosestToPos(selection.$from, predicate)\n}\n","import type { ExtensionConfig } from '../Extension.js'\nimport type { MarkConfig } from '../Mark.js'\nimport type { NodeConfig } from '../Node.js'\nimport type { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types.js'\n\n/**\n * Returns a field from an extension\n * @param extension The Tiptap extension\n * @param field The field, for example `renderHTML` or `priority`\n * @param context The context object that should be passed as `this` into the function\n * @returns The field value\n */\nexport function getExtensionField<T = any, E extends AnyExtension = any>(\n extension: E,\n field: keyof ExtensionConfig | keyof MarkConfig | keyof NodeConfig,\n context?: Omit<MaybeThisParameterType<T>, 'parent'>,\n): RemoveThis<T> {\n if (extension.config[field as keyof typeof extension.config] === undefined && extension.parent) {\n return getExtensionField(extension.parent, field, context)\n }\n\n if (typeof extension.config[field as keyof typeof extension.config] === 'function') {\n const value = (extension.config[field as keyof typeof extension.config] as any).bind({\n ...context,\n parent: extension.parent ? getExtensionField(extension.parent, field, context) : null,\n })\n\n return value\n }\n\n return extension.config[field as keyof typeof extension.config] as RemoveThis<T>\n}\n","// oxlint-disable-next-lineno-unsafe-function-type\nexport function isFunction(value: any): value is Function {\n return typeof value === 'function'\n}\n","import type { MaybeReturnType } from '../types.js'\nimport { isFunction } from './isFunction.js'\n\n/**\n * Optionally calls `value` as a function.\n * Otherwise it is returned directly.\n * @param value Function or any value.\n * @param context Optional context to bind to function.\n * @param props Optional props to pass to function.\n */\nexport function callOrReturn<T>(\n value: T,\n context: any = undefined,\n ...props: any[]\n): MaybeReturnType<T> {\n if (isFunction(value)) {\n if (context) {\n return value.bind(context)(...props)\n }\n\n return value(...props)\n }\n\n return value as MaybeReturnType<T>\n}\n","import type { Extension } from '../Extension.js'\nimport type { Mark } from '../Mark.js'\nimport type { Node } from '../Node.js'\nimport type { Extensions } from '../types.js'\n\nexport function splitExtensions(extensions: Extensions) {\n const baseExtensions = extensions.filter(\n extension => extension.type === 'extension',\n ) as Extension[]\n const nodeExtensions = extensions.filter(extension => extension.type === 'node') as Node[]\n const markExtensions = extensions.filter(extension => extension.type === 'mark') as Mark[]\n\n return {\n baseExtensions,\n nodeExtensions,\n markExtensions,\n }\n}\n","/** Splits a CSS style string into declarations, ignoring semicolons inside quotes/parentheses. */\nfunction splitStyleDeclarations(styles: string): string[] {\n const result: string[] = []\n\n let current = ''\n let inSingleQuote = false\n let inDoubleQuote = false\n let parenDepth = 0\n\n const length = styles.length\n for (let i = 0; i < length; i += 1) {\n const char = styles[i]\n if (char === \"'\" && !inDoubleQuote) {\n inSingleQuote = !inSingleQuote\n current += char\n continue\n }\n if (char === '\"' && !inSingleQuote) {\n inDoubleQuote = !inDoubleQuote\n current += char\n continue\n }\n if (!inSingleQuote && !inDoubleQuote) {\n if (char === '(') {\n parenDepth += 1\n current += char\n continue\n }\n if (char === ')' && parenDepth > 0) {\n parenDepth -= 1\n current += char\n continue\n }\n if (char === ';' && parenDepth === 0) {\n result.push(current)\n current = ''\n continue\n }\n }\n current += char\n }\n if (current) {\n result.push(current)\n }\n\n return result\n}\n\n/** Yields property/value pairs from a style string. */\nfunction parseStyleEntries(styles: string | undefined): [property: string, value: string][] {\n const pairs: [string, string][] = []\n\n const declarations = splitStyleDeclarations(styles || '')\n const numDeclarations = declarations.length\n\n for (let i = 0; i < numDeclarations; i += 1) {\n const declaration = declarations[i]\n\n const firstColonIndex = declaration.indexOf(':')\n if (firstColonIndex === -1) {\n continue\n }\n\n const property = declaration.slice(0, firstColonIndex).trim()\n const value = declaration.slice(firstColonIndex + 1).trim()\n if (property && value) {\n pairs.push([property, value])\n }\n }\n\n return pairs\n}\n\nexport function mergeAttributes(...objects: Record<string, any>[]): Record<string, any> {\n return objects\n .filter(item => !!item)\n .reduce((items, item) => {\n const mergedAttributes = { ...items }\n\n Object.entries(item).forEach(([key, value]) => {\n const exists = mergedAttributes[key]\n\n if (!exists) {\n mergedAttributes[key] = value\n\n return\n }\n\n if (key === 'class') {\n const valueClasses: string[] = value ? String(value).split(' ') : []\n const existingClasses: string[] = mergedAttributes[key]\n ? mergedAttributes[key].split(' ')\n : []\n\n const insertClasses = valueClasses.filter(\n valueClass => !existingClasses.includes(valueClass),\n )\n\n mergedAttributes[key] = [...existingClasses, ...insertClasses].join(' ')\n } else if (key === 'style') {\n const styleMap = new Map([\n ...parseStyleEntries(mergedAttributes[key]),\n ...parseStyleEntries(value),\n ])\n\n mergedAttributes[key] = Array.from(styleMap.entries())\n .map(([property, val]) => `${property}: ${val}`)\n .join('; ')\n } else {\n mergedAttributes[key] = value\n }\n })\n\n return mergedAttributes\n }, {})\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\nimport type { Range, TextSerializer } from '../types.js'\n\n/**\n * Gets the text between two positions in a Prosemirror node\n * and serializes it using the given text serializers and block separator (see getText)\n * @param startNode The Prosemirror node to start from\n * @param range The range of the text to get\n * @param options Options for the text serializer & block separator\n * @returns The text between the two positions\n */\nexport function getTextBetween(\n startNode: ProseMirrorNode,\n range: Range,\n options?: {\n blockSeparator?: string\n textSerializers?: Record<string, TextSerializer>\n },\n): string {\n const { from, to } = range\n const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {}\n let text = ''\n\n startNode.nodesBetween(from, to, (node, pos, parent, index) => {\n if (node.isBlock && pos > from) {\n text += blockSeparator\n }\n\n const textSerializer = textSerializers?.[node.type.name]\n\n if (textSerializer) {\n if (parent) {\n text += textSerializer({\n node,\n pos,\n parent,\n index,\n range,\n })\n }\n // do not descend into child nodes when there exists a serializer\n return false\n }\n\n if (node.isText) {\n text += node?.text?.slice(Math.max(from, pos) - pos, to - pos) // oxlint-disable-line\n }\n })\n\n return text\n}\n","import type { Schema } from '@tiptap/pm/model'\n\nimport type { TextSerializer } from '../types.js'\n\n/**\n * Find text serializers `toText` in a Prosemirror schema\n * @param schema The Prosemirror schema to search in\n * @returns A record of text serializers by node name\n */\nexport function getTextSerializersFromSchema(schema: Schema): Record<string, TextSerializer> {\n return Object.fromEntries(\n Object.entries(schema.nodes)\n .filter(([, node]) => node.spec.toText)\n .map(([name, node]) => [name, node.spec.toText]),\n )\n}\n","/**\n * Removes duplicated values within an array.\n * Supports numbers, strings and objects.\n */\nexport function removeDuplicates<T>(array: T[], by = JSON.stringify): T[] {\n const seen: Record<any, any> = {}\n\n return array.filter(item => {\n const key = by(item)\n\n return Object.prototype.hasOwnProperty.call(seen, key) ? false : (seen[key] = true)\n })\n}\n","import type { Step, Transform } from '@tiptap/pm/transform'\n\nimport type { Range } from '../types.js'\nimport { removeDuplicates } from '../utilities/removeDuplicates.js'\n\nexport type ChangedRange = {\n oldRange: Range\n newRange: Range\n}\n\n/**\n * Removes duplicated ranges and ranges that are\n * fully captured by other ranges.\n */\nfunction simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {\n const uniqueChanges = removeDuplicates(changes)\n\n return uniqueChanges.length === 1\n ? uniqueChanges\n : uniqueChanges.filter((change, index) => {\n const rest = uniqueChanges.filter((_, i) => i !== index)\n\n return !rest.some(otherChange => {\n return (\n change.oldRange.from >= otherChange.oldRange.from &&\n change.oldRange.to <= otherChange.oldRange.to &&\n change.newRange.from >= otherChange.newRange.from &&\n change.newRange.to <= otherChange.newRange.to\n )\n })\n })\n}\n\n/**\n * Returns a list of changed ranges\n * based on the first and last state of all steps.\n */\nexport function getChangedRanges(transform: Transform): ChangedRange[] {\n const { mapping, steps } = transform\n const changes: ChangedRange[] = []\n\n mapping.maps.forEach((stepMap, index) => {\n const ranges: Range[] = []\n\n // This accounts for step changes where no range was actually altered\n // e.g. when setting a mark, node attribute, etc.\n // @ts-ignore\n if (!stepMap.ranges.length) {\n const { from, to } = steps[index] as Step & {\n from?: number\n to?: number\n }\n\n if (from === undefined || to === undefined) {\n return\n }\n\n ranges.push({ from, to })\n } else {\n stepMap.forEach((from, to) => {\n ranges.push({ from, to })\n })\n }\n\n ranges.forEach(({ from, to }) => {\n const newStart = mapping.slice(index).map(from, -1)\n const newEnd = mapping.slice(index).map(to)\n const oldStart = mapping.invert().map(newStart, -1)\n const oldEnd = mapping.invert().map(newEnd)\n\n changes.push({\n oldRange: {\n from: oldStart,\n to: oldEnd,\n },\n newRange: {\n from: newStart,\n to: newEnd,\n },\n })\n })\n })\n\n return simplifyChangedRanges(changes)\n}\n","import type { ExtensionAttribute } from '../types.js'\n\n/**\n * Return attributes of an extension that should be splitted by keepOnSplit flag\n * @param extensionAttributes Array of extension attributes\n * @param typeName The type of the extension\n * @param attributes The attributes of the extension\n * @returns The splitted attributes\n */\nexport function getSplittedAttributes(\n extensionAttributes: ExtensionAttribute[],\n typeName: string,\n attributes: Record<string, any>,\n): Record<string, any> {\n return Object.fromEntries(\n Object.entries(attributes).filter(([name]) => {\n const extensionAttribute = extensionAttributes.find(item => {\n return item.type === typeName && item.name === name\n })\n\n if (!extensionAttribute) {\n return false\n }\n\n return extensionAttribute.attribute.keepOnSplit\n }),\n )\n}\n","import type { MarkType } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nimport type { MarkRange } from '../types.js'\nimport { objectIncludes } from '../utilities/objectIncludes.js'\nimport { getMarkType } from './getMarkType.js'\n\nexport function isMarkActive(\n state: EditorState,\n typeOrName: MarkType | string | null,\n attributes: Record<string, any> = {},\n): boolean {\n const { empty, ranges } = state.selection\n const type = typeOrName ? getMarkType(typeOrName, state.schema) : null\n\n if (empty) {\n return !!(state.storedMarks || state.selection.$from.marks())\n .filter(mark => {\n if (!type) {\n return true\n }\n\n return type.name === mark.type.name\n })\n .find(mark => objectIncludes(mark.attrs, attributes, { strict: false }))\n }\n\n let selectionRange = 0\n const markRanges: MarkRange[] = []\n\n ranges.forEach(({ $from, $to }) => {\n const from = $from.pos\n const to = $to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n // ignore selected text inside nodes whose schema disallows this mark type\n if (type && node.inlineContent && !node.type.allowsMarkType(type)) {\n return false\n }\n\n if (!node.isText && !node.marks.length) {\n return\n }\n\n const relativeFrom = Math.max(from, pos)\n const relativeTo = Math.min(to, pos + node.nodeSize)\n const range = relativeTo - relativeFrom\n\n selectionRange += range\n\n markRanges.push(\n ...node.marks.map(mark => ({\n mark,\n from: relativeFrom,\n to: relativeTo,\n })),\n )\n })\n })\n\n if (selectionRange === 0) {\n return false\n }\n\n // calculate range of matched mark\n const matchedRange = markRanges\n .filter(markRange => {\n if (!type) {\n return true\n }\n\n return type.name === markRange.mark.type.name\n })\n .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)\n\n // calculate range of marks that excludes the searched mark\n // for example `code` doesn’t allow any other marks\n const excludedRange = markRanges\n .filter(markRange => {\n if (!type) {\n return true\n }\n\n return markRange.mark.type !== type && markRange.mark.type.excludes(type)\n })\n .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)\n\n // we only include the result of `excludedRange`\n // if there is a match at all\n const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange\n\n return range >= selectionRange\n}\n","import { getExtensionField } from '../helpers/getExtensionField.js'\nimport type { NodeConfig } from '../index.js'\nimport type { Extensions } from '../types.js'\nimport { callOrReturn } from '../utilities/callOrReturn.js'\nimport { splitExtensions } from './splitExtensions.js'\n\nexport function isList(name: string, extensions: Extensions): boolean {\n const { nodeExtensions } = splitExtensions(extensions)\n const extension = nodeExtensions.find(item => item.name === name)\n\n if (!extension) {\n return false\n }\n\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n }\n const group = callOrReturn(getExtensionField<NodeConfig['group']>(extension, 'group', context))\n\n if (typeof group !== 'string') {\n return false\n }\n\n return group.split(' ').includes('list')\n}\n","import type { Node as ProseMirrorNode } from '@tiptap/pm/model'\n\n/**\n * Returns true if the given prosemirror node is empty.\n */\nexport function isNodeEmpty(\n node: ProseMirrorNode,\n {\n checkChildren = true,\n ignoreWhitespace = false,\n }: {\n /**\n * When true (default), it will also check if all children are empty.\n */\n checkChildren?: boolean\n /**\n * When true, it will ignore whitespace when checking for emptiness.\n */\n ignoreWhitespace?: boolean\n } = {},\n): boolean {\n if (ignoreWhitespace) {\n if (node.type.name === 'hardBreak') {\n // Hard breaks are considered empty\n return true\n }\n if (node.isText) {\n return !/\\S/.test(node.text ?? '')\n }\n }\n\n if (node.isText) {\n return !node.text\n }\n\n if (node.isAtom || node.isLeaf) {\n return false\n }\n\n if (node.content.childCount === 0) {\n return true\n }\n\n if (checkChildren) {\n let isContentEmpty = true\n\n node.content.forEach(childNode => {\n if (isContentEmpty === false) {\n // Exit early for perf\n return\n }\n\n if (!isNodeEmpty(childNode, { ignoreWhitespace, checkChildren })) {\n isContentEmpty = false\n }\n })\n\n return isContentEmpty\n }\n\n return false\n}\n","import type { MarkType, ResolvedPos } from '@tiptap/pm/model'\nimport type { EditorState, Transaction } from '@tiptap/pm/state'\n\nimport { getMarkAttributes } from '../helpers/getMarkAttributes.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { isTextSelection } from '../helpers/index.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setMark: {\n /**\n * Add a mark with new attributes.\n * @param typeOrName The mark type or name.\n * @example editor.commands.setMark('bold', { level: 1 })\n */\n setMark: (typeOrName: string | MarkType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nfunction canSetMark(state: EditorState, tr: Transaction, newMarkType: MarkType) {\n const { selection } = tr\n let cursor: ResolvedPos | null = null\n\n if (isTextSelection(selection)) {\n cursor = selection.$cursor\n }\n\n if (cursor) {\n const currentMarks = state.storedMarks ?? cursor.marks()\n const parentAllowsMarkType = cursor.parent.type.allowsMarkType(newMarkType)\n\n // There can be no current marks that exclude the new mark, and the parent must allow this mark type\n return (\n parentAllowsMarkType &&\n (!!newMarkType.isInSet(currentMarks) ||\n !currentMarks.some(mark => mark.type.excludes(newMarkType)))\n )\n }\n\n const { ranges } = selection\n\n return ranges.some(({ $from, $to }) => {\n let someNodeSupportsMark =\n $from.depth === 0\n ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)\n : false\n\n state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\n // If we already found a mark that we can enable, return false to bypass the remaining search\n if (someNodeSupportsMark) {\n return false\n }\n\n if (node.isInline) {\n const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType)\n const currentMarksAllowMarkType =\n !!newMarkType.isInSet(node.marks) ||\n !node.marks.some(otherMark => otherMark.type.excludes(newMarkType))\n\n someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType\n }\n return !someNodeSupportsMark\n })\n\n return someNodeSupportsMark\n })\n}\nexport const setMark: RawCommands['setMark'] =\n (typeOrName, attributes = {}) =>\n ({ tr, state, dispatch }) => {\n const { selection } = tr\n const { empty, ranges } = selection\n const type = getMarkType(typeOrName, state.schema)\n\n if (dispatch) {\n if (empty) {\n const oldAttributes = getMarkAttributes(state, type)\n\n tr.addStoredMark(\n type.create({\n ...oldAttributes,\n ...attributes,\n }),\n )\n } else {\n ranges.forEach(range => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n state.doc.nodesBetween(from, to, (node, pos) => {\n const trimmedFrom = Math.max(pos, from)\n const trimmedTo = Math.min(pos + node.nodeSize, to)\n const someHasMark = node.marks.find(mark => mark.type === type)\n\n // if there is already a mark of this type\n // we know that we have to merge its attributes\n // otherwise we add a fresh new mark\n if (someHasMark) {\n node.marks.forEach(mark => {\n if (type === mark.type) {\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n type.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n })\n } else {\n tr.addMark(trimmedFrom, trimmedTo, type.create(attributes))\n }\n })\n })\n }\n }\n\n return canSetMark(state, tr, type)\n }\n","import type { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setMeta: {\n /**\n * Store a metadata property in the current transaction.\n * @param key The key of the metadata property.\n * @param value The value to store.\n * @example editor.commands.setMeta('foo', 'bar')\n */\n setMeta: (key: string | Plugin | PluginKey, value: any) => ReturnType\n }\n }\n}\n\nexport const setMeta: RawCommands['setMeta'] =\n (key, value) =>\n ({ tr }) => {\n tr.setMeta(key, value)\n\n return true\n }\n","import { setBlockType } from '@tiptap/pm/commands'\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setNode: {\n /**\n * Replace a given range with a node.\n * @param typeOrName The type or name of the node\n * @param attributes The attributes of the node\n * @example editor.commands.setNode('paragraph')\n */\n setNode: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const setNode: RawCommands['setNode'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch, chain }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n let attributesToCopy: Record<string, any> | undefined\n\n if (state.selection.$anchor.sameParent(state.selection.$head)) {\n // only copy attributes if the selection is pointing to a node of the same type\n attributesToCopy = state.selection.$anchor.parent.attrs\n }\n\n // TODO: use a fallback like insertContent?\n if (!type.isTextblock) {\n console.warn('[tiptap warn]: Currently \"setNode()\" only supports text block nodes.')\n\n return false\n }\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(({ commands }) => {\n const canSetBlock = setBlockType(type, { ...attributesToCopy, ...attributes })(state)\n\n if (canSetBlock) {\n return true\n }\n\n return commands.clearNodes()\n })\n .command(({ state: updatedState }) => {\n return setBlockType(type, { ...attributesToCopy, ...attributes })(updatedState, dispatch)\n })\n .run()\n )\n }\n","import { NodeSelection } from '@tiptap/pm/state'\n\nimport type { RawCommands } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setNodeSelection: {\n /**\n * Creates a NodeSelection.\n * @param position - Position of the node.\n * @example editor.commands.setNodeSelection(10)\n */\n setNodeSelection: (position: number) => ReturnType\n }\n }\n}\n\nexport const setNodeSelection: RawCommands['setNodeSelection'] =\n position =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const { doc } = tr\n const from = minMax(position, 0, doc.content.size)\n const selection = NodeSelection.create(doc, from)\n\n tr.setSelection(selection)\n }\n\n return true\n }\n","import type { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setTextDirection: {\n /**\n * Set the text direction for nodes.\n * If no position is provided, it will use the current selection.\n * @param direction The text direction to set ('ltr', 'rtl', or 'auto')\n * @param position Optional position or range to apply the direction to\n * @example editor.commands.setTextDirection('rtl')\n * @example editor.commands.setTextDirection('ltr', { from: 0, to: 10 })\n */\n setTextDirection: (direction: 'ltr' | 'rtl' | 'auto', position?: number | Range) => ReturnType\n }\n }\n}\n\nexport const setTextDirection: RawCommands['setTextDirection'] =\n (direction, position) =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n let from: number\n let to: number\n\n if (typeof position === 'number') {\n from = position\n to = position\n } else if (position && 'from' in position && 'to' in position) {\n from = position.from\n to = position.to\n } else {\n from = selection.from\n to = selection.to\n }\n\n if (dispatch) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n dir: direction,\n })\n })\n }\n\n return true\n }\n","import { TextSelection } from '@tiptap/pm/state'\n\nimport type { Range, RawCommands } from '../types.js'\nimport { minMax } from '../utilities/minMax.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n setTextSelection: {\n /**\n * Creates a TextSelection.\n * @param position The position of the selection.\n * @example editor.commands.setTextSelection(10)\n */\n setTextSelection: (position: number | Range) => ReturnType\n }\n }\n}\n\nexport const setTextSelection: RawCommands['setTextSelection'] =\n position =>\n ({ tr, dispatch }) => {\n if (dispatch) {\n const { doc } = tr\n const { from, to } =\n typeof position === 'number' ? { from: position, to: position } : position\n const minPos = TextSelection.atStart(doc).from\n const maxPos = TextSelection.atEnd(doc).to\n const resolvedFrom = minMax(from, minPos, maxPos)\n const resolvedEnd = minMax(to, minPos, maxPos)\n const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd)\n\n tr.setSelection(selection)\n }\n\n return true\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport { sinkListItem as originalSinkListItem } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n sinkListItem: {\n /**\n * Sink the list item down into an inner list.\n * @param typeOrName The type or name of the node.\n * @example editor.commands.sinkListItem('listItem')\n */\n sinkListItem: (typeOrName: string | NodeType) => ReturnType\n }\n }\n}\n\nexport const sinkListItem: RawCommands['sinkListItem'] =\n typeOrName =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalSinkListItem(type)(state, dispatch)\n }\n","import type { EditorState } from '@tiptap/pm/state'\nimport { NodeSelection, TextSelection } from '@tiptap/pm/state'\nimport { canSplit } from '@tiptap/pm/transform'\n\nimport { defaultBlockAt } from '../helpers/defaultBlockAt.js'\nimport { getSplittedAttributes } from '../helpers/getSplittedAttributes.js'\nimport type { RawCommands } from '../types.js'\n\nfunction ensureMarks(state: EditorState, splittableMarks?: string[]) {\n const marks =\n state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks())\n\n if (marks) {\n const filteredMarks = marks.filter(mark => splittableMarks?.includes(mark.type.name))\n\n state.tr.ensureMarks(filteredMarks)\n }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n splitBlock: {\n /**\n * Forks a new node from an existing node.\n * @param options.keepMarks Keep marks from the previous node.\n * @example editor.commands.splitBlock()\n * @example editor.commands.splitBlock({ keepMarks: true })\n */\n splitBlock: (options?: { keepMarks?: boolean }) => ReturnType\n }\n }\n}\n\nexport const splitBlock: RawCommands['splitBlock'] =\n ({ keepMarks = true } = {}) =>\n ({ tr, state, dispatch, editor }) => {\n const { selection, doc } = tr\n const { $from, $to } = selection\n const extensionAttributes = editor.extensionManager.attributes\n const newAttributes = getSplittedAttributes(\n extensionAttributes,\n $from.node().type.name,\n $from.node().attrs,\n )\n\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n if (!$from.parentOffset || !canSplit(doc, $from.pos)) {\n return false\n }\n\n if (dispatch) {\n if (keepMarks) {\n ensureMarks(state, editor.extensionManager.splittableMarks)\n }\n\n tr.split($from.pos).scrollIntoView()\n }\n\n return true\n }\n\n if (!$from.parent.isBlock) {\n return false\n }\n\n const atEnd = $to.parentOffset === $to.parent.content.size\n\n const deflt =\n $from.depth === 0\n ? undefined\n : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)))\n\n let types =\n atEnd && deflt\n ? [\n {\n type: deflt,\n attrs: newAttributes,\n },\n ]\n : undefined\n\n let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types)\n\n if (\n !types &&\n !can &&\n canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)\n ) {\n can = true\n types = deflt\n ? [\n {\n type: deflt,\n attrs: newAttributes,\n },\n ]\n : undefined\n }\n\n if (dispatch) {\n if (can) {\n if (selection instanceof TextSelection) {\n tr.deleteSelection()\n }\n\n tr.split(tr.mapping.map($from.pos), 1, types)\n\n if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\n const first = tr.mapping.map($from.before())\n const $first = tr.doc.resolve(first)\n\n if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {\n tr.setNodeMarkup(tr.mapping.map($from.before()), deflt)\n }\n }\n }\n\n if (keepMarks) {\n ensureMarks(state, editor.extensionManager.splittableMarks)\n }\n\n tr.scrollIntoView()\n }\n\n return can\n }\n","import type { Node as ProseMirrorNode, NodeType } from '@tiptap/pm/model'\nimport { Fragment, Slice } from '@tiptap/pm/model'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { canSplit } from '@tiptap/pm/transform'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSplittedAttributes } from '../helpers/getSplittedAttributes.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n splitListItem: {\n /**\n * Splits one list item into two list items.\n * @param typeOrName The type or name of the node.\n * @param overrideAttrs The attributes to ensure on the new node.\n * @example editor.commands.splitListItem('listItem')\n */\n splitListItem: (\n typeOrName: string | NodeType,\n overrideAttrs?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const splitListItem: RawCommands['splitListItem'] =\n (typeOrName, overrideAttrs = {}) =>\n ({ tr, state, dispatch, editor }) => {\n const type = getNodeType(typeOrName, state.schema)\n const { $from, $to } = state.selection\n\n // @ts-ignore\n // oxlint-disable-next-line\n const node: ProseMirrorNode = state.selection.node\n\n if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\n return false\n }\n\n const grandParent = $from.node(-1)\n\n if (grandParent.type !== type) {\n return false\n }\n\n const extensionAttributes = editor.extensionManager.attributes\n\n if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if (\n $from.depth === 2 ||\n $from.node(-3).type !== type ||\n $from.index(-2) !== $from.node(-2).childCount - 1\n ) {\n return false\n }\n\n if (dispatch) {\n let wrap = Fragment.empty\n // oxlint-disable-next-line\n const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3\n\n // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {\n wrap = Fragment.from($from.node(d).copy(wrap))\n }\n\n const depthAfter =\n // oxlint-disable-next-line no-nested-ternary\n $from.indexAfter(-1) < $from.node(-2).childCount\n ? 1\n : $from.indexAfter(-2) < $from.node(-3).childCount\n ? 2\n : 3\n\n // Add a second list item with an empty default start node\n const newNextTypeAttributes = {\n ...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),\n ...overrideAttrs,\n }\n const nextType =\n type.contentMatch.defaultType?.createAndFill(newNextTypeAttributes) || undefined\n\n wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined))\n\n const start = $from.before($from.depth - (depthBefore - 1))\n\n tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0))\n\n let sel = -1\n\n tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\n if (sel > -1) {\n return false\n }\n\n if (n.isTextblock && n.content.size === 0) {\n sel = pos + 1\n }\n })\n\n if (sel > -1) {\n tr.setSelection(TextSelection.near(tr.doc.resolve(sel)))\n }\n\n tr.scrollIntoView()\n }\n\n return true\n }\n\n const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null\n\n const newTypeAttributes = {\n ...getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs),\n ...overrideAttrs,\n }\n const newNextTypeAttributes = {\n ...getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs),\n ...overrideAttrs,\n }\n\n tr.delete($from.pos, $to.pos)\n\n const types = nextType\n ? [\n { type, attrs: newTypeAttributes },\n { type: nextType, attrs: newNextTypeAttributes },\n ]\n : [{ type, attrs: newTypeAttributes }]\n\n if (!canSplit(tr.doc, $from.pos, 2)) {\n return false\n }\n\n if (dispatch) {\n const { selection, storedMarks } = state\n const { splittableMarks } = editor.extensionManager\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n tr.split($from.pos, 2, types).scrollIntoView()\n\n if (!marks || !dispatch) {\n return true\n }\n\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n }\n\n return true\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { canJoin } from '@tiptap/pm/transform'\n\nimport { findParentNode } from '../helpers/findParentNode.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isList } from '../helpers/isList.js'\nimport type { RawCommands } from '../types.js'\n\nconst joinListBackwards = (tr: Transaction, listType: NodeType): boolean => {\n const list = findParentNode(node => node.type === listType)(tr.selection)\n\n if (!list) {\n return true\n }\n\n const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth)\n\n if (before === undefined) {\n return true\n }\n\n const nodeBefore = tr.doc.nodeAt(before)\n const canJoinBackwards = list.node.type === nodeBefore?.type && canJoin(tr.doc, list.pos)\n\n if (!canJoinBackwards) {\n return true\n }\n\n tr.join(list.pos)\n\n return true\n}\n\nconst joinListForwards = (tr: Transaction, listType: NodeType): boolean => {\n const list = findParentNode(node => node.type === listType)(tr.selection)\n\n if (!list) {\n return true\n }\n\n const after = tr.doc.resolve(list.start).after(list.depth)\n\n if (after === undefined) {\n return true\n }\n\n const nodeAfter = tr.doc.nodeAt(after)\n const canJoinForwards = list.node.type === nodeAfter?.type && canJoin(tr.doc, after)\n\n if (!canJoinForwards) {\n return true\n }\n\n tr.join(after)\n\n return true\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleList: {\n /**\n * Toggle between different list types.\n * @param listTypeOrName The type or name of the list.\n * @param itemTypeOrName The type or name of the list item.\n * @param keepMarks Keep marks when toggling.\n * @param attributes Attributes for the new list.\n * @example editor.commands.toggleList('bulletList', 'listItem')\n */\n toggleList: (\n listTypeOrName: string | NodeType,\n itemTypeOrName: string | NodeType,\n keepMarks?: boolean,\n attributes?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nfunction createInnerSelectionForWholeDocList(tr: Transaction) {\n const doc = tr.doc\n const list = doc.firstChild\n\n if (!list) {\n return null\n }\n\n // Place the selection inside the list node so that ProseMirror's\n // liftListItem command can operate. AllSelection sits at the doc root.\n // Use TextSelection.between to resolve positions into valid inline\n // content positions, so the selection survives position mapping after\n // liftListItem removes list/item wrappers.\n const $start = doc.resolve(1)\n const $end = doc.resolve(list.nodeSize - 1)\n\n return TextSelection.between($start, $end)\n}\nexport const toggleList: RawCommands['toggleList'] =\n (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) =>\n ({ editor, tr, state, dispatch, chain, commands, can }) => {\n const { extensions, splittableMarks } = editor.extensionManager\n const listType = getNodeType(listTypeOrName, state.schema)\n const itemType = getNodeType(itemTypeOrName, state.schema)\n const { selection, storedMarks } = state\n const { $from, $to } = selection\n const range = $from.blockRange($to)\n\n const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks())\n\n if (!range) {\n return false\n }\n\n const parentList = findParentNode(node => isList(node.type.name, extensions))(selection)\n\n // When the user presses Ctrl/Cmd+A, ProseMirror creates an `AllSelection`\n // covering the entire document (0..doc.content.size). In that case\n // `findParentNode` cannot detect the surrounding list because the\n // selection sits at the document root. If the document consists of a\n // single top-level list node, treat that list as the active list so the\n // toggle logic can correctly lift or change it.\n const isAllSelection = selection.from === 0 && selection.to === state.doc.content.size\n const topLevelNodes = state.doc.content.content\n const soleTopLevelNode = topLevelNodes.length === 1 ? topLevelNodes[0] : null\n const allSelectionList =\n isAllSelection && soleTopLevelNode && isList(soleTopLevelNode.type.name, extensions)\n ? {\n node: soleTopLevelNode,\n pos: 0,\n depth: 0,\n }\n : null\n\n const currentList = parentList ?? allSelectionList\n\n const isInsideExistingList =\n !!parentList && range.depth >= 1 && range.depth - parentList.depth <= 1\n\n const hasWholeDocSelectedList = !!allSelectionList\n if ((isInsideExistingList || hasWholeDocSelectedList) && currentList) {\n // remove list\n if (currentList.node.type === listType) {\n if (isAllSelection && hasWholeDocSelectedList) {\n return chain()\n .command(({ tr: trx, dispatch: disp }) => {\n // Ctrl/Cmd+A creates an AllSelection at the document root.\n // When the whole document is a single top-level list, normalize the\n // selection into that list before lifting, since liftListItem expects\n // a selection inside a list item.\n const nextSelection = createInnerSelectionForWholeDocList(trx)\n\n if (!nextSelection) {\n return false\n }\n\n trx.setSelection(nextSelection)\n\n if (disp) {\n disp(trx)\n }\n\n return true\n })\n .liftListItem(itemType)\n .run()\n }\n\n return commands.liftListItem(itemType)\n }\n\n // change list type\n if (\n isList(currentList.node.type.name, extensions) &&\n listType.validContent(currentList.node.content)\n ) {\n return chain()\n .command(() => {\n tr.setNodeMarkup(currentList.pos, listType)\n\n return true\n })\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n }\n }\n\n if (!keepMarks || !marks || !dispatch) {\n return (\n chain()\n // try to convert node to default node if needed\n .command(() => {\n const canWrapInList = can().wrapInList(listType, attributes)\n if (canWrapInList) {\n return true\n }\n return commands.clearNodes()\n })\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n )\n }\n\n return (\n chain()\n // try to convert node to default node if needed\n .command(() => {\n const canWrapInList = can().wrapInList(listType, attributes)\n\n const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name))\n\n tr.ensureMarks(filteredMarks)\n\n if (canWrapInList) {\n return true\n }\n return commands.clearNodes()\n })\n .wrapInList(listType, attributes)\n .command(() => joinListBackwards(tr, listType))\n .command(() => joinListForwards(tr, listType))\n .run()\n )\n }\n","import type { MarkType } from '@tiptap/pm/model'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { isMarkActive } from '../helpers/isMarkActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleMark: {\n /**\n * Toggle a mark on and off.\n * @param typeOrName The mark type or name.\n * @param attributes The attributes of the mark.\n * @param options.extendEmptyMarkRange Removes the mark even across the current selection. Defaults to `false`.\n * @example editor.commands.toggleMark('bold')\n */\n toggleMark: (\n /**\n * The mark type or name.\n */\n typeOrName: string | MarkType,\n\n /**\n * The attributes of the mark.\n */\n attributes?: Record<string, any>,\n\n options?: {\n /**\n * Removes the mark even across the current selection. Defaults to `false`.\n */\n extendEmptyMarkRange?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const toggleMark: RawCommands['toggleMark'] =\n (typeOrName, attributes = {}, options = {}) =>\n ({ state, commands }) => {\n const { extendEmptyMarkRange = false } = options\n const type = getMarkType(typeOrName, state.schema)\n const isActive = isMarkActive(state, type, attributes)\n\n if (isActive) {\n return commands.unsetMark(type, { extendEmptyMarkRange })\n }\n\n return commands.setMark(type, attributes)\n }\n","import type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleNode: {\n /**\n * Toggle a node with another node.\n * @param typeOrName The type or name of the node.\n * @param toggleTypeOrName The type or name of the node to toggle.\n * @param attributes The attributes of the node.\n * @example editor.commands.toggleNode('heading', 'paragraph')\n */\n toggleNode: (\n typeOrName: string | NodeType,\n toggleTypeOrName: string | NodeType,\n attributes?: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const toggleNode: RawCommands['toggleNode'] =\n (typeOrName, toggleTypeOrName, attributes = {}) =>\n ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema)\n const toggleType = getNodeType(toggleTypeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n let attributesToCopy: Record<string, any> | undefined\n\n if (state.selection.$anchor.sameParent(state.selection.$head)) {\n // only copy attributes if the selection is pointing to a node of the same type\n attributesToCopy = state.selection.$anchor.parent.attrs\n }\n\n if (isActive) {\n return commands.setNode(toggleType, attributesToCopy)\n }\n\n // If the node is not active, we want to set the new node type with the given attributes\n // Copying over the attributes from the current node if the selection is pointing to a node of the same type\n return commands.setNode(type, { ...attributesToCopy, ...attributes })\n }\n","import type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { isNodeActive } from '../helpers/isNodeActive.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n toggleWrap: {\n /**\n * Wraps nodes in another node, or removes an existing wrap.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.toggleWrap('blockquote')\n */\n toggleWrap: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const toggleWrap: RawCommands['toggleWrap'] =\n (typeOrName, attributes = {}) =>\n ({ state, commands }) => {\n const type = getNodeType(typeOrName, state.schema)\n const isActive = isNodeActive(state, type, attributes)\n\n if (isActive) {\n return commands.lift(type)\n }\n\n return commands.wrapIn(type, attributes)\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n undoInputRule: {\n /**\n * Undo an input rule.\n * @example editor.commands.undoInputRule()\n */\n undoInputRule: () => ReturnType\n }\n }\n}\n\nexport const undoInputRule: RawCommands['undoInputRule'] =\n () =>\n ({ state, dispatch }) => {\n const plugins = state.plugins\n\n for (let i = 0; i < plugins.length; i += 1) {\n const plugin = plugins[i]\n let undoable\n\n // @ts-ignore\n // oxlint-disable-next-line\n if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n if (dispatch) {\n const tr = state.tr\n const toUndo = undoable.transform\n\n for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) {\n tr.step(toUndo.steps[j].invert(toUndo.docs[j]))\n }\n\n if (undoable.text) {\n const marks = tr.doc.resolve(undoable.from).marks()\n\n tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks))\n } else {\n tr.delete(undoable.from, undoable.to)\n }\n }\n\n return true\n }\n }\n\n return false\n }\n","import type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unsetAllMarks: {\n /**\n * Remove all clearable marks in the current selection.\n * Marks with `clearable: false` are preserved\n * @param options.ignoreClearable If true, removes all marks regardless of `clearable` setting. Defaults to `false`.\n * @example editor.commands.unsetAllMarks()\n * @example editor.commands.unsetAllMarks({ ignoreClearable: true })\n */\n unsetAllMarks: (options?: { ignoreClearable?: boolean }) => ReturnType\n }\n }\n}\n\nexport const unsetAllMarks: RawCommands['unsetAllMarks'] =\n (options = {}) =>\n ({ tr, dispatch, editor }) => {\n const { ignoreClearable = false } = options\n const { selection } = tr\n const { empty, ranges } = selection\n\n if (empty) {\n return true\n }\n\n const { nonClearableMarks } = editor.extensionManager\n\n if (dispatch) {\n const clearableMarkTypes = Object.values(editor.schema.marks).filter(\n markType => ignoreClearable || !nonClearableMarks.includes(markType.name),\n )\n\n ranges.forEach(range => {\n for (const markType of clearableMarkTypes) {\n tr.removeMark(range.$from.pos, range.$to.pos, markType)\n }\n })\n }\n\n return true\n }\n","import type { MarkType } from '@tiptap/pm/model'\n\nimport { getMarkRange } from '../helpers/getMarkRange.js'\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unsetMark: {\n /**\n * Remove all marks in the current selection.\n * @param typeOrName The mark type or name.\n * @param options.extendEmptyMarkRange Removes the mark even across the current selection. Defaults to `false`.\n * @example editor.commands.unsetMark('bold')\n */\n unsetMark: (\n /**\n * The mark type or name.\n */\n typeOrName: string | MarkType,\n\n options?: {\n /**\n * Removes the mark even across the current selection. Defaults to `false`.\n */\n extendEmptyMarkRange?: boolean\n },\n ) => ReturnType\n }\n }\n}\n\nexport const unsetMark: RawCommands['unsetMark'] =\n (typeOrName, options = {}) =>\n ({ tr, state, dispatch }) => {\n const { extendEmptyMarkRange = false } = options\n const { selection } = tr\n const type = getMarkType(typeOrName, state.schema)\n const { $from, empty, ranges } = selection\n\n if (!dispatch) {\n return true\n }\n\n if (empty && extendEmptyMarkRange) {\n let { from, to } = selection\n const attrs = $from.marks().find(mark => mark.type === type)?.attrs\n const range = getMarkRange($from, type, attrs)\n\n if (range) {\n from = range.from\n to = range.to\n }\n\n tr.removeMark(from, to, type)\n } else {\n ranges.forEach(range => {\n tr.removeMark(range.$from.pos, range.$to.pos, type)\n })\n }\n\n tr.removeStoredMark(type)\n\n return true\n }\n","import type { Range, RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n unsetTextDirection: {\n /**\n * Remove the text direction attribute from nodes.\n * If no position is provided, it will use the current selection.\n * @param position Optional position or range to remove the direction from\n * @example editor.commands.unsetTextDirection()\n * @example editor.commands.unsetTextDirection({ from: 0, to: 10 })\n */\n unsetTextDirection: (position?: number | Range) => ReturnType\n }\n }\n}\n\nexport const unsetTextDirection: RawCommands['unsetTextDirection'] =\n position =>\n ({ tr, state, dispatch }) => {\n const { selection } = state\n let from: number\n let to: number\n\n if (typeof position === 'number') {\n from = position\n to = position\n } else if (position && 'from' in position && 'to' in position) {\n from = position.from\n to = position.to\n } else {\n from = selection.from\n to = selection.to\n }\n\n if (dispatch) {\n tr.doc.nodesBetween(from, to, (node, pos) => {\n if (node.isText) {\n return\n }\n\n const newAttrs = { ...node.attrs }\n\n delete newAttrs.dir\n\n tr.setNodeMarkup(pos, undefined, newAttrs)\n })\n }\n\n return true\n }\n","import type { Mark, MarkType, Node, NodeType } from '@tiptap/pm/model'\nimport type { SelectionRange } from '@tiptap/pm/state'\n\nimport { getMarkType } from '../helpers/getMarkType.js'\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport { getSchemaTypeNameByName } from '../helpers/getSchemaTypeNameByName.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n updateAttributes: {\n /**\n * Update attributes of a node or mark.\n * @param typeOrName The type or name of the node or mark.\n * @param attributes The attributes of the node or mark.\n * @example editor.commands.updateAttributes('mention', { userId: \"2\" })\n */\n updateAttributes: (\n /**\n * The type or name of the node or mark.\n */\n typeOrName: string | NodeType | MarkType,\n\n /**\n * The attributes of the node or mark.\n */\n attributes: Record<string, any>,\n ) => ReturnType\n }\n }\n}\n\nexport const updateAttributes: RawCommands['updateAttributes'] =\n (typeOrName, attributes = {}) =>\n ({ tr, state, dispatch }) => {\n let nodeType: NodeType | null = null\n let markType: MarkType | null = null\n\n const schemaType = getSchemaTypeNameByName(\n typeof typeOrName === 'string' ? typeOrName : typeOrName.name,\n state.schema,\n )\n\n if (!schemaType) {\n return false\n }\n\n if (schemaType === 'node') {\n nodeType = getNodeType(typeOrName as NodeType, state.schema)\n }\n\n if (schemaType === 'mark') {\n markType = getMarkType(typeOrName as MarkType, state.schema)\n }\n\n let canUpdate = false\n\n tr.selection.ranges.forEach((range: SelectionRange) => {\n const from = range.$from.pos\n const to = range.$to.pos\n\n let lastPos: number | undefined\n let lastNode: Node | undefined\n let trimmedFrom: number\n let trimmedTo: number\n\n if (tr.selection.empty) {\n state.doc.nodesBetween(from, to, (node: Node, pos: number) => {\n if (nodeType && nodeType === node.type) {\n canUpdate = true\n trimmedFrom = Math.max(pos, from)\n trimmedTo = Math.min(pos + node.nodeSize, to)\n lastPos = pos\n lastNode = node\n }\n })\n } else {\n state.doc.nodesBetween(from, to, (node: Node, pos: number) => {\n if (pos < from && nodeType && nodeType === node.type) {\n canUpdate = true\n trimmedFrom = Math.max(pos, from)\n trimmedTo = Math.min(pos + node.nodeSize, to)\n lastPos = pos\n lastNode = node\n }\n\n if (pos >= from && pos <= to) {\n if (nodeType && nodeType === node.type) {\n canUpdate = true\n\n if (dispatch) {\n tr.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n ...attributes,\n })\n }\n }\n\n if (markType && node.marks.length) {\n node.marks.forEach((mark: Mark) => {\n if (markType === mark.type) {\n canUpdate = true\n\n if (dispatch) {\n const trimmedFrom2 = Math.max(pos, from)\n const trimmedTo2 = Math.min(pos + node.nodeSize, to)\n\n tr.addMark(\n trimmedFrom2,\n trimmedTo2,\n markType.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n }\n })\n }\n }\n })\n }\n\n if (lastNode) {\n if (lastPos !== undefined && dispatch) {\n tr.setNodeMarkup(lastPos, undefined, {\n ...lastNode.attrs,\n ...attributes,\n })\n }\n\n if (markType && lastNode.marks.length) {\n lastNode.marks.forEach((mark: Mark) => {\n if (markType === mark.type && dispatch) {\n tr.addMark(\n trimmedFrom,\n trimmedTo,\n markType.create({\n ...mark.attrs,\n ...attributes,\n }),\n )\n }\n })\n }\n }\n })\n\n return canUpdate\n }\n","import { wrapIn as originalWrapIn } from '@tiptap/pm/commands'\nimport type { NodeType } from '@tiptap/pm/model'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n wrapIn: {\n /**\n * Wraps nodes in another node.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.wrapIn('blockquote')\n */\n wrapIn: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const wrapIn: RawCommands['wrapIn'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalWrapIn(type, attributes)(state, dispatch)\n }\n","import type { NodeType } from '@tiptap/pm/model'\nimport { wrapInList as originalWrapInList } from '@tiptap/pm/schema-list'\n\nimport { getNodeType } from '../helpers/getNodeType.js'\nimport type { RawCommands } from '../types.js'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n wrapInList: {\n /**\n * Wrap a node in a list.\n * @param typeOrName The type or name of the node.\n * @param attributes The attributes of the node.\n * @example editor.commands.wrapInList('bulletList')\n */\n wrapInList: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType\n }\n }\n}\n\nexport const wrapInList: RawCommands['wrapInList'] =\n (typeOrName, attributes = {}) =>\n ({ state, dispatch }) => {\n const type = getNodeType(typeOrName, state.schema)\n\n return originalWrapInList(type, attributes)(state, dispatch)\n }\n","// see: https://github.com/mesqueeb/is-what/blob/88d6e4ca92fb2baab6003c54e02eedf4e729e5ab/src/index.ts\n\nfunction getType(value: any): string {\n return Object.prototype.toString.call(value).slice(8, -1)\n}\n\nexport function isPlainObject(value: any): value is Record<string, any> {\n if (getType(value) !== 'Object') {\n return false\n }\n\n return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype\n}\n","import { isPlainObject } from './isPlainObject.js'\n\nexport function mergeDeep(\n target: Record<string, any>,\n source: Record<string, any>,\n): Record<string, any> {\n const output = { ...target }\n\n if (isPlainObject(target) && isPlainObject(source)) {\n Object.keys(source).forEach(key => {\n if (isPlainObject(source[key]) && isPlainObject(target[key])) {\n output[key] = mergeDeep(target[key], source[key])\n } else {\n output[key] = source[key]\n }\n })\n }\n\n return output\n}\n","import type { Plugin } from '@tiptap/pm/state'\n\nimport type { Editor } from './Editor.js'\nimport { getExtensionField } from './helpers/getExtensionField.js'\nimport type { ExtensionConfig, MarkConfig, NodeConfig } from './index.js'\nimport type { InputRule } from './InputRule.js'\nimport type { Mark } from './Mark.js'\nimport type { Node } from './Node.js'\nimport type { PasteRule } from './PasteRule.js'\nimport type {\n AnyConfig,\n DispatchTransactionProps,\n EditorEvents,\n Extensions,\n GlobalAttributes,\n JSONContent,\n KeyboardShortcutCommand,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownRendererHelpers,\n MarkdownToken,\n MarkdownTokenizer,\n ParentConfig,\n RawCommands,\n RenderContext,\n} from './types.js'\nimport { callOrReturn } from './utilities/callOrReturn.js'\nimport { mergeDeep } from './utilities/mergeDeep.js'\n\nexport interface ExtendableConfig<\n Options = any,\n Storage = any,\n Config extends\n | ExtensionConfig<Options, Storage>\n | NodeConfig<Options, Storage>\n | MarkConfig<Options, Storage>\n | ExtendableConfig<Options, Storage> = ExtendableConfig<Options, Storage, any, any>,\n PMType = any,\n> {\n /**\n * The extension name - this must be unique.\n * It will be used to identify the extension.\n *\n * @example 'myExtension'\n */\n name: string\n\n /**\n * The priority of your extension. The higher, the earlier it will be called\n * and will take precedence over other extensions with a lower priority.\n * @default 100\n * @example 101\n */\n priority?: number\n\n /**\n * This method will add options to this extension\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#settings\n * @example\n * addOptions() {\n * return {\n * myOption: 'foo',\n * myOtherOption: 10,\n * }\n */\n addOptions?: (this: { name: string; parent: ParentConfig<Config>['addOptions'] }) => Options\n\n /**\n * The default storage this extension can save data to.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#storage\n * @example\n * defaultStorage: {\n * prefetchedUsers: [],\n * loading: false,\n * }\n */\n addStorage?: (this: {\n name: string\n options: Options\n parent: ParentConfig<Config>['addStorage']\n }) => Storage\n\n /**\n * This function adds globalAttributes to specific nodes.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#global-attributes\n * @example\n * addGlobalAttributes() {\n * return [\n * {\n // Extend the following extensions\n * types: [\n * 'heading',\n * 'paragraph',\n * ],\n * // … with those attributes\n * attributes: {\n * textAlign: {\n * default: 'left',\n * renderHTML: attributes => ({\n * style: `text-align: ${attributes.textAlign}`,\n * }),\n * parseHTML: element => element.style.textAlign || 'left',\n * },\n * },\n * },\n * ]\n * }\n */\n addGlobalAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n extensions: (Node | Mark)[]\n parent: ParentConfig<Config>['addGlobalAttributes']\n }) => GlobalAttributes\n\n /**\n * This function adds commands to the editor\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#commands\n * @example\n * addCommands() {\n * return {\n * myCommand: () => ({ chain }) => chain().setMark('type', 'foo').run(),\n * }\n * }\n */\n addCommands?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addCommands']\n }) => Partial<RawCommands>\n\n /**\n * This function registers keyboard shortcuts.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#keyboard-shortcuts\n * @example\n * addKeyboardShortcuts() {\n * return {\n * 'Mod-l': () => this.editor.commands.toggleBulletList(),\n * }\n * },\n */\n addKeyboardShortcuts?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addKeyboardShortcuts']\n }) => {\n [key: string]: KeyboardShortcutCommand\n }\n\n /**\n * This function adds input rules to the editor.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#input-rules\n * @example\n * addInputRules() {\n * return [\n * markInputRule({\n * find: inputRegex,\n * type: this.type,\n * }),\n * ]\n * },\n */\n addInputRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addInputRules']\n }) => InputRule[]\n\n /**\n * This function adds paste rules to the editor.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#paste-rules\n * @example\n * addPasteRules() {\n * return [\n * markPasteRule({\n * find: pasteRegex,\n * type: this.type,\n * }),\n * ]\n * },\n */\n addPasteRules?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addPasteRules']\n }) => PasteRule[]\n\n /**\n * This function adds Prosemirror plugins to the editor\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#prosemirror-plugins\n * @example\n * addProseMirrorPlugins() {\n * return [\n * customPlugin(),\n * ]\n * }\n */\n addProseMirrorPlugins?: (this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['addProseMirrorPlugins']\n }) => Plugin[]\n\n /**\n * This function transforms pasted HTML content before it's parsed.\n * Extensions can use this to modify or clean up pasted HTML.\n * The transformations are chained - each extension's transform receives\n * the output from the previous extension's transform.\n * @see https://tiptap.dev/docs/editor/guide/custom-extensions#transform-pasted-html\n * @example\n * transformPastedHTML(html) {\n * // Remove all style attributes\n * return html.replace(/style=\"[^\"]*\"/g, '')\n * }\n */\n transformPastedHTML?: (\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['transformPastedHTML']\n },\n html: string,\n ) => string\n\n /**\n * This function adds additional extensions to the editor. This is useful for\n * building extension kits.\n * @example\n * addExtensions() {\n * return [\n * BulletList,\n * OrderedList,\n * ListItem\n * ]\n * }\n */\n addExtensions?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<Config>['addExtensions']\n }) => Extensions\n\n /**\n * The markdown token name\n *\n * This is the name of the token that this extension uses to parse and render markdown and comes from the Marked Lexer.\n *\n * @see https://github.com/markedjs/marked/blob/master/src/Tokens.ts\n *\n */\n markdownTokenName?: string\n\n /**\n * The parse function used by the markdown parser to convert markdown tokens to ProseMirror nodes.\n */\n parseMarkdown?: (token: MarkdownToken, helpers: MarkdownParseHelpers) => MarkdownParseResult\n\n /**\n * The serializer function used by the markdown serializer to convert ProseMirror nodes to markdown tokens.\n */\n renderMarkdown?: (\n node: JSONContent,\n helpers: MarkdownRendererHelpers,\n ctx: RenderContext,\n ) => string\n\n /**\n * The markdown tokenizer responsible for turning a markdown string into tokens\n *\n * Custom tokenizers are only needed when you want to parse non-standard markdown token.\n */\n markdownTokenizer?: MarkdownTokenizer\n\n /**\n * Optional markdown options for indentation\n */\n markdownOptions?: {\n /**\n * Defines if this markdown element should indent it's child elements\n */\n indentsContent?: boolean\n\n /**\n * Lets a mark tell the Markdown serializer which inline HTML tags it can\n * safely use when plain markdown delimiters would become ambiguous.\n *\n * This is mainly useful for overlapping marks. For example, bold followed\n * by bold+italic followed by italic cannot always be written back with only\n * `*` and `**` in a way that still parses correctly. In that case, the\n * serializer can close the overlapping section with markdown and reopen the\n * remaining tail with HTML instead.\n *\n * Example:\n * - desired formatting: `**123` + `*456*` + `789 italic`\n * - serialized result: `**123*456***<em>789</em>`\n *\n * If your extension defines custom mark names, set `htmlReopen` on that\n * extension so the serializer can reuse its HTML form for overlap cases.\n */\n htmlReopen?: {\n open: string\n close: string\n }\n }\n\n /**\n * This function extends the schema of the node.\n * @example\n * extendNodeSchema() {\n * return {\n * group: 'inline',\n * selectable: false,\n * }\n * }\n */\n extendNodeSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<Config>['extendNodeSchema']\n },\n extension: Node,\n ) => Record<string, any>)\n | null\n\n /**\n * This function extends the schema of the mark.\n * @example\n * extendMarkSchema() {\n * return {\n * group: 'inline',\n * selectable: false,\n * }\n * }\n */\n extendMarkSchema?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<Config>['extendMarkSchema']\n },\n extension: Mark,\n ) => Record<string, any>)\n | null\n\n /**\n * The editor is not ready yet.\n */\n onBeforeCreate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onBeforeCreate']\n },\n event: EditorEvents['beforeCreate'],\n ) => void)\n | null\n\n /**\n * The editor is ready.\n */\n onCreate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onCreate']\n },\n event: EditorEvents['create'],\n ) => void)\n | null\n\n /**\n * The content has changed.\n */\n onUpdate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onUpdate']\n },\n event: EditorEvents['update'],\n ) => void)\n | null\n\n /**\n * The selection has changed.\n */\n onSelectionUpdate?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onSelectionUpdate']\n },\n event: EditorEvents['selectionUpdate'],\n ) => void)\n | null\n\n /**\n * The editor state has changed.\n */\n onTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onTransaction']\n },\n event: EditorEvents['transaction'],\n ) => void)\n | null\n\n /**\n * The editor is focused.\n */\n onFocus?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onFocus']\n },\n event: EditorEvents['focus'],\n ) => void)\n | null\n\n /**\n * The editor isn’t focused anymore.\n */\n onBlur?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onBlur']\n },\n event: EditorEvents['blur'],\n ) => void)\n | null\n\n /**\n * The editor is destroyed.\n */\n onDestroy?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['onDestroy']\n },\n event: EditorEvents['destroy'],\n ) => void)\n | null\n\n /**\n * This hook allows you to intercept and modify transactions before they are dispatched.\n *\n * Example\n * ```ts\n * dispatchTransaction({ transaction, next }) {\n * console.log('Dispatching transaction:', transaction)\n * next(transaction)\n * }\n * ```\n *\n * @param props - The dispatch transaction props\n */\n dispatchTransaction?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: PMType\n parent: ParentConfig<Config>['dispatchTransaction']\n },\n props: DispatchTransactionProps,\n ) => void)\n | null\n}\n\nexport class Extendable<\n Options = any,\n Storage = any,\n Config =\n | ExtensionConfig<Options, Storage>\n | NodeConfig<Options, Storage>\n | MarkConfig<Options, Storage>,\n> {\n type = 'extendable'\n parent: Extendable | null = null\n\n child: Extendable | null = null\n\n name = ''\n\n config: Config = {\n name: this.name,\n } as Config\n\n constructor(config: Partial<Config> = {}) {\n this.config = {\n ...this.config,\n ...config,\n }\n\n this.name = (this.config as any).name\n }\n\n get options(): Options {\n return {\n ...callOrReturn(\n getExtensionField<AnyConfig['addOptions']>(this as any, 'addOptions', {\n name: this.name,\n }),\n ),\n }\n }\n\n get storage(): Readonly<Storage> {\n return {\n ...callOrReturn(\n getExtensionField<AnyConfig['addStorage']>(this as any, 'addStorage', {\n name: this.name,\n options: this.options,\n }),\n ),\n }\n }\n\n configure(options: Partial<Options> = {}) {\n const extension = this.extend<Options, Storage, Config>({\n ...this.config,\n addOptions: () => {\n return mergeDeep(this.options as Record<string, any>, options) as Options\n },\n })\n\n extension.name = this.name\n extension.parent = this.parent\n\n this.child = null\n\n return extension\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig =\n | ExtensionConfig<ExtendedOptions, ExtendedStorage>\n | NodeConfig<ExtendedOptions, ExtendedStorage>\n | MarkConfig<ExtendedOptions, ExtendedStorage>,\n >(extendedConfig: Partial<ExtendedConfig> = {}): Extendable<ExtendedOptions, ExtendedStorage> {\n const extension = new (this.constructor as any)({ ...this.config, ...extendedConfig })\n\n extension.parent = this\n this.child = extension\n extension.name = 'name' in extendedConfig ? extendedConfig.name : extension.parent.name\n\n return extension\n }\n}\n","import type { DOMOutputSpec, Mark as ProseMirrorMark, MarkSpec, MarkType } from '@tiptap/pm/model'\n\nimport type { Editor } from './Editor.js'\nimport type { ExtendableConfig } from './Extendable.js'\nimport { Extendable } from './Extendable.js'\nimport type { Attributes, MarkViewRenderer, ParentConfig } from './types.js'\n\nexport interface MarkConfig<Options = any, Storage = any> extends ExtendableConfig<\n Options,\n Storage,\n MarkConfig<Options, Storage>,\n MarkType\n> {\n /**\n * Mark View\n */\n addMarkView?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: MarkType\n parent: ParentConfig<MarkConfig<Options, Storage>>['addMarkView']\n }) => MarkViewRenderer)\n | null\n\n /**\n * Keep mark after split node\n */\n keepOnSplit?: boolean | (() => boolean)\n\n /**\n * Whether this mark is removed by `unsetAllMarks`.\n * Set to `false` for semantic marks (comments, suggestions) that should survive \"clear formatting\".\n * @default true\n */\n clearable?: boolean | (() => boolean)\n\n /**\n * Inclusive\n */\n inclusive?:\n | MarkSpec['inclusive']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['inclusive']\n editor?: Editor\n }) => MarkSpec['inclusive'])\n\n /**\n * Excludes\n */\n excludes?:\n | MarkSpec['excludes']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['excludes']\n editor?: Editor\n }) => MarkSpec['excludes'])\n\n /**\n * Marks this Mark as exitable\n */\n exitable?: boolean | (() => boolean)\n\n /**\n * Group\n */\n group?:\n | MarkSpec['group']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['group']\n editor?: Editor\n }) => MarkSpec['group'])\n\n /**\n * Spanning\n */\n spanning?:\n | MarkSpec['spanning']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['spanning']\n editor?: Editor\n }) => MarkSpec['spanning'])\n\n /**\n * Code\n */\n code?:\n | boolean\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['code']\n editor?: Editor\n }) => boolean)\n\n /**\n * Parse HTML\n */\n parseHTML?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['parseHTML']\n editor?: Editor\n }) => MarkSpec['parseDOM']\n\n /**\n * Render HTML\n */\n renderHTML?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['renderHTML']\n editor?: Editor\n },\n props: {\n mark: ProseMirrorMark\n HTMLAttributes: Record<string, any>\n },\n ) => DOMOutputSpec)\n | null\n\n /**\n * Attributes\n */\n addAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<MarkConfig<Options, Storage>>['addAttributes']\n editor?: Editor\n // oxlint-disable-next-lineno-empty-object-type\n }) => Attributes | {}\n}\n\n/**\n * The Mark class is used to create custom mark extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nexport class Mark<Options = any, Storage = any> extends Extendable<\n Options,\n Storage,\n MarkConfig<Options, Storage>\n> {\n type = 'mark'\n\n /**\n * Create a new Mark instance\n * @param config - Mark configuration object or a function that returns a configuration object\n */\n static create<O = any, S = any>(\n config: Partial<MarkConfig<O, S>> | (() => Partial<MarkConfig<O, S>>) = {},\n ) {\n // If the config is a function, execute it to get the configuration object\n const resolvedConfig = typeof config === 'function' ? config() : config\n return new Mark<O, S>(resolvedConfig)\n }\n\n static handleExit({ editor, mark }: { editor: Editor; mark: Mark }) {\n const { tr } = editor.state\n const currentPos = editor.state.selection.$from\n const isAtEnd = currentPos.pos === currentPos.end()\n\n if (isAtEnd) {\n const currentMarks = currentPos.marks()\n const isInMark = !!currentMarks.find(m => m?.type.name === mark.name)\n\n if (!isInMark) {\n return false\n }\n\n const removeMark = currentMarks.find(m => m?.type.name === mark.name)\n\n if (removeMark) {\n tr.removeStoredMark(removeMark)\n }\n tr.insertText(' ', currentPos.pos)\n\n editor.view.dispatch(tr)\n\n return true\n }\n\n return false\n }\n\n configure(options?: Partial<Options>) {\n return super.configure(options) as Mark<Options, Storage>\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig extends MarkConfig<ExtendedOptions, ExtendedStorage> = MarkConfig<\n ExtendedOptions,\n ExtendedStorage\n >,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string\n options: ExtendedOptions\n storage: ExtendedStorage\n editor: Editor\n type: MarkType\n }>),\n ): Mark<ExtendedOptions, ExtendedStorage> {\n // If the extended config is a function, execute it to get the configuration object\n const resolvedConfig = typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig\n return super.extend(resolvedConfig) as Mark<ExtendedOptions, ExtendedStorage>\n }\n}\n","export { ClipboardTextSerializer } from './clipboardTextSerializer.js'\nexport { Commands } from './commands.js'\nexport { Delete } from './delete.js'\nexport { Drop } from './drop.js'\nexport { Editable } from './editable.js'\nexport { FocusEvents, focusEventsPluginKey } from './focusEvents.js'\nexport { Keymap } from './keymap.js'\nexport { Paste } from './paste.js'\nexport { Tabindex } from './tabindex.js'\nexport { TextDirection } from './textDirection.js'\n","import type { Editor } from './Editor.js'\nimport { type ExtendableConfig, Extendable } from './Extendable.js'\n\n// oxlint-disable-next-lineno-empty-object-type\nexport interface ExtensionConfig<Options = any, Storage = any> extends ExtendableConfig<\n Options,\n Storage,\n ExtensionConfig<Options, Storage>,\n null\n> {}\n\n/**\n * The Extension class is the base class for all extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nexport class Extension<Options = any, Storage = any> extends Extendable<\n Options,\n Storage,\n ExtensionConfig<Options, Storage>\n> {\n type = 'extension'\n\n /**\n * Create a new Extension instance\n * @param config - Extension configuration object or a function that returns a configuration object\n */\n static create<O = any, S = any>(\n config: Partial<ExtensionConfig<O, S>> | (() => Partial<ExtensionConfig<O, S>>) = {},\n ) {\n // If the config is a function, execute it to get the configuration object\n const resolvedConfig = typeof config === 'function' ? config() : config\n return new Extension<O, S>(resolvedConfig)\n }\n\n configure(options?: Partial<Options>) {\n return super.configure(options) as Extension<Options, Storage>\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig = ExtensionConfig<ExtendedOptions, ExtendedStorage>,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string\n options: ExtendedOptions\n storage: ExtendedStorage\n editor: Editor\n type: null\n }>),\n ): Extension<ExtendedOptions, ExtendedStorage> {\n // If the extended config is a function, execute it to get the configuration object\n const resolvedConfig = typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig\n return super.extend(resolvedConfig) as Extension<ExtendedOptions, ExtendedStorage>\n }\n}\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\nimport { getTextBetween } from '../helpers/getTextBetween.js'\nimport { getTextSerializersFromSchema } from '../helpers/getTextSerializersFromSchema.js'\n\nexport type ClipboardTextSerializerOptions = {\n blockSeparator?: string\n}\n\nexport const ClipboardTextSerializer = Extension.create<ClipboardTextSerializerOptions>({\n name: 'clipboardTextSerializer',\n\n addOptions() {\n return {\n blockSeparator: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('clipboardTextSerializer'),\n props: {\n clipboardTextSerializer: () => {\n const { editor } = this\n const { state, schema } = editor\n const { doc, selection } = state\n const textSerializers = getTextSerializersFromSchema(schema)\n const { blockSeparator } = this.options\n const options = {\n ...(blockSeparator !== undefined ? { blockSeparator } : {}),\n textSerializers,\n }\n\n // Serialize each selection range independently and join the results.\n // CellSelection exposes one range per selected cell; flattening to\n // min(from)/max(to) would pull in unselected cells between them.\n // Sort by document position so reverse selections (e.g. dragging\n // upward) still emit text in document order.\n const sortedRanges = [...selection.ranges].sort((a, b) => a.$from.pos - b.$from.pos)\n\n return sortedRanges\n .map(({ $from, $to }) =>\n getTextBetween(doc, { from: $from.pos, to: $to.pos }, options),\n )\n .join(blockSeparator ?? '\\n\\n')\n },\n },\n }),\n ]\n },\n})\n","import * as commands from '../commands/index.js'\nimport { Extension } from '../Extension.js'\n\nexport * from '../commands/index.js'\n\nexport const Commands = Extension.create({\n name: 'commands',\n\n addCommands() {\n return {\n ...commands,\n }\n },\n})\n","import { RemoveMarkStep } from '@tiptap/pm/transform'\n\nimport { Extension } from '../Extension.js'\nimport { combineTransactionSteps, getChangedRanges } from '../helpers/index.js'\n\n/**\n * This extension allows you to be notified when the user deletes content you are interested in.\n */\nexport const Delete = Extension.create({\n name: 'delete',\n\n onUpdate({ transaction, appendedTransactions }) {\n const callback = () => {\n if (\n this.editor.options.coreExtensionOptions?.delete?.filterTransaction?.(transaction) ??\n transaction.getMeta('y-sync$')\n ) {\n return\n }\n const nextTransaction = combineTransactionSteps(transaction.before, [\n transaction,\n ...appendedTransactions,\n ])\n const changes = getChangedRanges(nextTransaction)\n\n changes.forEach(change => {\n if (\n nextTransaction.mapping.mapResult(change.oldRange.from).deletedAfter &&\n nextTransaction.mapping.mapResult(change.oldRange.to).deletedBefore\n ) {\n nextTransaction.before.nodesBetween(\n change.oldRange.from,\n change.oldRange.to,\n (node, from) => {\n const to = from + node.nodeSize - 2\n const isFullyWithinRange = change.oldRange.from <= from && to <= change.oldRange.to\n\n this.editor.emit('delete', {\n type: 'node',\n node,\n from,\n to,\n newFrom: nextTransaction.mapping.map(from),\n newTo: nextTransaction.mapping.map(to),\n deletedRange: change.oldRange,\n newRange: change.newRange,\n partial: !isFullyWithinRange,\n editor: this.editor,\n transaction,\n combinedTransform: nextTransaction,\n })\n },\n )\n }\n })\n\n const mapping = nextTransaction.mapping\n nextTransaction.steps.forEach((step, index) => {\n if (step instanceof RemoveMarkStep) {\n const newStart = mapping.slice(index).map(step.from, -1)\n const newEnd = mapping.slice(index).map(step.to)\n const oldStart = mapping.invert().map(newStart, -1)\n const oldEnd = mapping.invert().map(newEnd)\n\n const foundBeforeMark =\n newStart > 0\n ? nextTransaction.doc.nodeAt(newStart - 1)?.marks.some(mark => mark.eq(step.mark))\n : false\n const foundAfterMark = nextTransaction.doc\n .nodeAt(newEnd)\n ?.marks.some(mark => mark.eq(step.mark))\n\n this.editor.emit('delete', {\n type: 'mark',\n mark: step.mark,\n from: step.from,\n to: step.to,\n deletedRange: {\n from: oldStart,\n to: oldEnd,\n },\n newRange: {\n from: newStart,\n to: newEnd,\n },\n partial: Boolean(foundAfterMark || foundBeforeMark),\n editor: this.editor,\n transaction,\n combinedTransform: nextTransaction,\n })\n }\n })\n }\n\n if (this.editor.options.coreExtensionOptions?.delete?.async ?? true) {\n setTimeout(callback, 0)\n } else {\n callback()\n }\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Drop = Extension.create({\n name: 'drop',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tiptapDrop'),\n\n props: {\n handleDrop: (_, e, slice, moved) => {\n this.editor.emit('drop', {\n editor: this.editor,\n event: e,\n slice,\n moved,\n })\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Editable = Extension.create({\n name: 'editable',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: () => this.editor.options.editable,\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const focusEventsPluginKey = new PluginKey('focusEvents')\n\nexport const FocusEvents = Extension.create({\n name: 'focusEvents',\n\n addProseMirrorPlugins() {\n const { editor } = this\n\n return [\n new Plugin({\n key: focusEventsPluginKey,\n props: {\n handleDOMEvents: {\n focus: (view, event: Event) => {\n editor.isFocused = true\n\n const transaction = editor.state.tr\n .setMeta('focus', { event })\n .setMeta('addToHistory', false)\n\n view.dispatch(transaction)\n\n return false\n },\n blur: (view, event: Event) => {\n editor.isFocused = false\n\n const transaction = editor.state.tr\n .setMeta('blur', { event })\n .setMeta('addToHistory', false)\n\n view.dispatch(transaction)\n\n return false\n },\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey, Selection } from '@tiptap/pm/state'\n\nimport { CommandManager } from '../CommandManager.js'\nimport { Extension } from '../Extension.js'\nimport { createChainableState } from '../helpers/createChainableState.js'\nimport { isNodeEmpty } from '../helpers/isNodeEmpty.js'\nimport { isiOS } from '../utilities/isiOS.js'\nimport { isMacOS } from '../utilities/isMacOS.js'\n\nexport const Keymap = Extension.create({\n name: 'keymap',\n\n addKeyboardShortcuts() {\n const handleBackspace = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.undoInputRule(),\n\n // maybe convert first text block node to default node\n () =>\n commands.command(({ tr }) => {\n const { selection, doc } = tr\n const { empty, $anchor } = selection\n const { pos, parent } = $anchor\n const $parentPos =\n $anchor.parent.isTextblock && pos > 0 ? tr.doc.resolve(pos - 1) : $anchor\n const parentIsIsolating = $parentPos.parent.type.spec.isolating\n\n const parentPos = $anchor.pos - $anchor.parentOffset\n\n const isAtStart =\n parentIsIsolating && $parentPos.parent.childCount === 1\n ? parentPos === $anchor.pos\n : Selection.atStart(doc).from === pos\n\n if (\n !empty ||\n !parent.type.isTextblock ||\n parent.textContent.length ||\n !isAtStart ||\n (isAtStart && $anchor.parent.type.name === 'paragraph') // prevent clearNodes when no nodes to clear, otherwise history stack is appended\n ) {\n return false\n }\n\n return commands.clearNodes()\n }),\n\n () => commands.deleteSelection(),\n () => commands.joinBackward(),\n () => commands.selectNodeBackward(),\n ])\n\n const handleDelete = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.deleteSelection(),\n () => commands.deleteCurrentNode(),\n () => commands.joinForward(),\n () => commands.selectNodeForward(),\n ])\n\n const handleEnter = () =>\n this.editor.commands.first(({ commands }) => [\n () => commands.newlineInCode(),\n () => commands.createParagraphNear(),\n () => commands.liftEmptyBlock(),\n () => commands.splitBlock(),\n ])\n\n const baseKeymap = {\n Enter: handleEnter,\n 'Mod-Enter': () => this.editor.commands.exitCode(),\n Backspace: handleBackspace,\n 'Mod-Backspace': handleBackspace,\n 'Shift-Backspace': handleBackspace,\n Delete: handleDelete,\n 'Mod-Delete': handleDelete,\n 'Mod-a': () => this.editor.commands.selectAll(),\n }\n\n const pcKeymap = {\n ...baseKeymap,\n }\n\n const macKeymap = {\n ...baseKeymap,\n 'Ctrl-h': handleBackspace,\n 'Alt-Backspace': handleBackspace,\n 'Ctrl-d': handleDelete,\n 'Ctrl-Alt-Backspace': handleDelete,\n 'Alt-Delete': handleDelete,\n 'Alt-d': handleDelete,\n 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),\n 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),\n }\n\n if (isiOS() || isMacOS()) {\n return macKeymap\n }\n\n return pcKeymap\n },\n\n addProseMirrorPlugins() {\n return [\n // With this plugin we check if the whole document was selected and deleted.\n // In this case we will additionally call `clearNodes()` to convert e.g. a heading\n // to a paragraph if necessary.\n // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well\n // with many other commands.\n new Plugin({\n key: new PluginKey('clearDocument'),\n appendTransaction: (transactions, oldState, newState) => {\n if (transactions.some(tr => tr.getMeta('composition'))) {\n return\n }\n\n const docChanges =\n transactions.some(transaction => transaction.docChanged) &&\n !oldState.doc.eq(newState.doc)\n\n const ignoreTr = transactions.some(transaction =>\n transaction.getMeta('preventClearDocument'),\n )\n\n if (!docChanges || ignoreTr) {\n return\n }\n\n const { empty, from, to } = oldState.selection\n const allFrom = Selection.atStart(oldState.doc).from\n const allEnd = Selection.atEnd(oldState.doc).to\n const allWasSelected = from === allFrom && to === allEnd\n\n if (empty || !allWasSelected) {\n return\n }\n\n const isEmpty = isNodeEmpty(newState.doc)\n\n if (!isEmpty) {\n return\n }\n\n const tr = newState.tr\n const state = createChainableState({\n state: newState,\n transaction: tr,\n })\n const { commands } = new CommandManager({\n editor: this.editor,\n state,\n })\n\n commands.clearNodes()\n\n if (!tr.steps.length) {\n return\n }\n\n return tr\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\nexport const Paste = Extension.create({\n name: 'paste',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tiptapPaste'),\n\n props: {\n handlePaste: (_view, e, slice) => {\n this.editor.emit('paste', {\n editor: this.editor,\n event: e,\n slice,\n })\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\n\n/**\n * Options for the Tabindex extension.\n */\nexport type TabindexOptions = {\n /**\n * The value for the `tabindex` attribute on the editor element.\n * When undefined, editable editors default to `0` and non-editable editors get no tabindex.\n */\n value?: string\n}\n\n/**\n * The Tabindex extension adds a configurable tabindex attribute to the editor.\n *\n * By default, the editor gets tabindex=\"0\" when editable. This can be customized\n * via coreExtensionOptions to support specific focus ordering requirements in forms\n * or to enable focusing on non-editable editors.\n *\n * @example\n * ```ts\n * new Editor({\n * coreExtensionOptions: {\n * tabindex: {\n * value: '-1',\n * },\n * },\n * })\n * ```\n */\nexport const Tabindex = Extension.create<TabindexOptions>({\n name: 'tabindex',\n\n addOptions() {\n return {\n value: undefined,\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('tabindex'),\n props: {\n attributes: (): { [name: string]: string } => {\n if (!this.editor.isEditable && this.options.value === undefined) {\n return {}\n }\n return { tabindex: this.options.value ?? '0' }\n },\n },\n }),\n ]\n },\n})\n","import { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { Extension } from '../Extension.js'\nimport { splitExtensions } from '../helpers/splitExtensions.js'\n\nexport interface TextDirectionOptions {\n direction: 'ltr' | 'rtl' | 'auto' | undefined\n}\n\n/**\n * The TextDirection extension adds support for setting text direction (LTR/RTL/auto)\n * on all nodes in the editor.\n *\n * This extension adds a global `dir` attribute to all node types, which can be used\n * to control bidirectional text rendering. The direction can be set globally via\n * editor options or per-node using commands.\n */\nexport const TextDirection = Extension.create<TextDirectionOptions>({\n name: 'textDirection',\n\n addOptions() {\n return {\n direction: undefined,\n }\n },\n\n addGlobalAttributes() {\n // Only add the dir attribute to nodes if text direction is configured\n // This prevents null/undefined values from appearing in JSON exports\n if (!this.options.direction) {\n return []\n }\n\n const { nodeExtensions } = splitExtensions(this.extensions)\n\n return [\n {\n types: nodeExtensions\n .filter(extension => extension.name !== 'text')\n .map(extension => extension.name),\n attributes: {\n dir: {\n default: this.options.direction,\n parseHTML: element => {\n const dir = element.getAttribute('dir')\n\n if (dir && (dir === 'ltr' || dir === 'rtl' || dir === 'auto')) {\n return dir\n }\n\n return this.options.direction\n },\n renderHTML: attributes => {\n if (!attributes.dir) {\n return {}\n }\n\n return {\n dir: attributes.dir,\n }\n },\n },\n },\n },\n ]\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('textDirection'),\n props: {\n attributes: (): { [name: string]: string } => {\n const direction = this.options.direction\n\n if (!direction) {\n return {}\n }\n\n return {\n dir: direction,\n }\n },\n },\n }),\n ]\n },\n})\n","/**\n * @fileoverview Markdown utilities for creating standardized markdown specs.\n *\n * This module provides utilities for creating complete markdown specifications\n * for different types of nodes using unified syntax patterns.\n */\n\nexport * from './attributeUtils.js'\nexport * from './createAtomBlockMarkdownSpec.js'\nexport * from './createBlockMarkdownSpec.js'\nexport * from './createInlineMarkdownSpec.js'\nexport * from './parseIndentedBlocks.js'\nexport * from './renderNestedMarkdownContent.js'\n","/**\n * @fileoverview Utility functions for parsing and serializing markdown attributes.\n *\n * These utilities handle the common patterns for parsing attribute strings\n * in various markdown syntaxes like Pandoc attributes.\n */\n\n/**\n * Parses a Pandoc-style attribute string into an object.\n *\n * Supports the following patterns:\n * - Classes: `.className` → `{ class: 'className' }`\n * - IDs: `#myId` → `{ id: 'myId' }`\n * - Key-value pairs: `key=\"value\"` → `{ key: 'value' }`\n * - Boolean attributes: `disabled` → `{ disabled: true }`\n *\n * @param attrString - The attribute string to parse\n * @returns Parsed attributes object\n *\n * @example\n * ```ts\n * parseAttributes('.btn #submit disabled type=\"button\"')\n * // → { class: 'btn', id: 'submit', disabled: true, type: 'button' }\n * ```\n */\nexport function parseAttributes(attrString: string): Record<string, any> {\n if (!attrString?.trim()) {\n return {}\n }\n\n const attributes: Record<string, any> = {}\n\n // First, extract and remove quoted strings to avoid parsing content inside them\n const quotedStrings: string[] = []\n const tempString = attrString.replace(/[\"']([^\"']*)[\"']/g, match => {\n quotedStrings.push(match)\n return `__QUOTED_${quotedStrings.length - 1}__`\n })\n\n // Parse classes (.className) - only outside of quoted strings\n const classMatches = tempString.match(/(?:^|\\s)\\.([a-zA-Z][\\w-]*)/g)\n if (classMatches) {\n const classes = classMatches.map(match => match.trim().slice(1)) // Remove the dot\n attributes.class = classes.join(' ')\n }\n\n // Parse IDs (#myId) - only outside of quoted strings\n const idMatch = tempString.match(/(?:^|\\s)#([a-zA-Z][\\w-]*)/)\n if (idMatch) {\n attributes.id = idMatch[1]\n }\n\n // Parse key-value pairs (key=\"value\" or key='value') - restore quoted strings\n const kvRegex = /([a-zA-Z][\\w-]*)\\s*=\\s*(__QUOTED_\\d+__)/g\n const kvMatches = Array.from(tempString.matchAll(kvRegex))\n kvMatches.forEach(([, key, quotedRef]) => {\n const quotedIndex = parseInt(quotedRef.match(/__QUOTED_(\\d+)__/)?.[1] || '0', 10)\n const quotedValue = quotedStrings[quotedIndex]\n if (quotedValue) {\n // Remove the outer quotes\n attributes[key] = quotedValue.slice(1, -1)\n }\n })\n\n // Parse boolean attributes (standalone words that aren't classes/IDs)\n const cleanString = tempString\n .replace(/(?:^|\\s)\\.([a-zA-Z][\\w-]*)/g, '') // Remove classes\n .replace(/(?:^|\\s)#([a-zA-Z][\\w-]*)/g, '') // Remove IDs\n .replace(/([a-zA-Z][\\w-]*)\\s*=\\s*__QUOTED_\\d+__/g, '') // Remove key-value pairs\n .trim()\n\n if (cleanString) {\n const booleanAttrs = cleanString.split(/\\s+/).filter(Boolean)\n booleanAttrs.forEach(attr => {\n if (attr.match(/^[a-zA-Z][\\w-]*$/)) {\n attributes[attr] = true\n }\n })\n }\n\n return attributes\n}\n\n/**\n * Serializes an attributes object back to a Pandoc-style attribute string.\n *\n * @param attributes - The attributes object to serialize\n * @returns Serialized attribute string\n *\n * @example\n * ```ts\n * serializeAttributes({ class: 'btn primary', id: 'submit', disabled: true, type: 'button' })\n * // → '.btn.primary #submit disabled type=\"button\"'\n * ```\n */\nexport function serializeAttributes(attributes: Record<string, any>): string {\n if (!attributes || Object.keys(attributes).length === 0) {\n return ''\n }\n\n const parts: string[] = []\n\n // Handle classes\n if (attributes.class) {\n const classes = String(attributes.class).split(/\\s+/).filter(Boolean)\n classes.forEach(cls => parts.push(`.${cls}`))\n }\n\n // Handle ID\n if (attributes.id) {\n parts.push(`#${attributes.id}`)\n }\n\n // Handle other attributes\n Object.entries(attributes).forEach(([key, value]) => {\n if (key === 'class' || key === 'id') {\n return // Already handled\n }\n\n if (value === true) {\n // Boolean attribute\n parts.push(key)\n } else if (value !== false && value != null) {\n // Key-value attribute\n parts.push(`${key}=\"${String(value)}\"`)\n }\n })\n\n return parts.join(' ')\n}\n","import type {\n JSONContent,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownToken,\n MarkdownTokenizer,\n} from '../../types.js'\nimport {\n parseAttributes as defaultParseAttributes,\n serializeAttributes as defaultSerializeAttributes,\n} from './attributeUtils.js'\n\nexport interface AtomBlockMarkdownSpecOptions {\n /** The Tiptap node name this spec is for */\n nodeName: string\n /** The markdown syntax name (defaults to nodeName if not provided) */\n name?: string\n /** Function to parse attributes from token attribute string */\n parseAttributes?: (attrString: string) => Record<string, any>\n /** Function to serialize attributes back to string for rendering */\n serializeAttributes?: (attrs: Record<string, any>) => string\n /** Default attributes to apply when parsing */\n defaultAttributes?: Record<string, any>\n /** Required attributes that must be present for successful parsing */\n requiredAttributes?: string[]\n /** Attributes that are allowed to be rendered back to markdown (whitelist) */\n allowedAttributes?: string[]\n}\n\n/**\n * Creates a complete markdown spec for atomic block nodes using Pandoc syntax.\n *\n * The generated spec handles:\n * - Parsing self-closing blocks with `:::blockName {attributes}`\n * - Extracting and parsing attributes\n * - Validating required attributes\n * - Rendering blocks back to markdown\n *\n * @param options - Configuration for the atomic block markdown spec\n * @returns Complete markdown specification object\n *\n * @example\n * ```ts\n * const youtubeSpec = createAtomBlockMarkdownSpec({\n * nodeName: 'youtube',\n * requiredAttributes: ['src'],\n * defaultAttributes: { start: 0 },\n * allowedAttributes: ['src', 'start', 'width', 'height'] // Only these get rendered to markdown\n * })\n *\n * // Usage in extension:\n * export const Youtube = Node.create({\n * // ... other config\n * markdown: youtubeSpec\n * })\n * ```\n */\nexport function createAtomBlockMarkdownSpec(options: AtomBlockMarkdownSpecOptions): {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => MarkdownParseResult\n markdownTokenizer: MarkdownTokenizer\n renderMarkdown: (node: JSONContent) => string\n} {\n const {\n nodeName,\n name: markdownName,\n parseAttributes = defaultParseAttributes,\n serializeAttributes = defaultSerializeAttributes,\n defaultAttributes = {},\n requiredAttributes = [],\n allowedAttributes,\n } = options\n\n // Use markdownName for syntax, fallback to nodeName\n const blockName = markdownName || nodeName\n\n // Helper function to filter attributes based on allowlist\n const filterAttributes = (attrs: Record<string, any>) => {\n if (!allowedAttributes) {\n return attrs\n }\n\n const filtered: Record<string, any> = {}\n allowedAttributes.forEach(key => {\n if (key in attrs) {\n filtered[key] = attrs[key]\n }\n })\n return filtered\n }\n\n return {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => {\n const attrs = { ...defaultAttributes, ...token.attributes }\n return h.createNode(nodeName, attrs, [])\n },\n\n markdownTokenizer: {\n name: nodeName,\n level: 'block' as const,\n start(src: string) {\n const regex = new RegExp(`^:::${blockName}(?:\\\\s|$)`, 'm')\n const index = src.match(regex)?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, _tokens, _lexer) {\n // Use non-global regex to match from the start of the string\n // Include optional newline to ensure we consume the entire line\n const regex = new RegExp(`^:::${blockName}(?:\\\\s+\\\\{([^}]*)\\\\})?\\\\s*:::(?:\\\\n|$)`)\n const match = src.match(regex)\n\n if (!match) {\n return undefined\n }\n\n // Parse attributes if present\n const attrString = match[1] || ''\n const attributes = parseAttributes(attrString)\n\n // Validate required attributes\n const missingRequired = requiredAttributes.find(required => !(required in attributes))\n if (missingRequired) {\n return undefined\n }\n\n return {\n type: nodeName,\n raw: match[0],\n attributes,\n }\n },\n },\n\n renderMarkdown: node => {\n const filteredAttrs = filterAttributes(node.attrs || {})\n const attrs = serializeAttributes(filteredAttrs)\n const attrString = attrs ? ` {${attrs}}` : ''\n\n return `:::${blockName}${attrString} :::`\n },\n }\n}\n","import type {\n JSONContent,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownRendererHelpers,\n MarkdownToken,\n MarkdownTokenizer,\n} from '../../types.js'\nimport {\n parseAttributes as defaultParseAttributes,\n serializeAttributes as defaultSerializeAttributes,\n} from './attributeUtils.js'\n\nexport interface BlockMarkdownSpecOptions {\n /** The Tiptap node name this spec is for */\n nodeName: string\n /** The markdown syntax name (defaults to nodeName if not provided) */\n name?: string\n /** Function to extract content from the node for serialization */\n getContent?: (token: MarkdownToken) => string\n /** Function to parse attributes from the attribute string */\n parseAttributes?: (attrString: string) => Record<string, any>\n /** Function to serialize attributes to string */\n serializeAttributes?: (attrs: Record<string, any>) => string\n /** Default attributes to apply when parsing */\n defaultAttributes?: Record<string, any>\n /** Content type: 'block' allows paragraphs/lists/etc, 'inline' only allows bold/italic/links/etc */\n content?: 'block' | 'inline'\n /** Allowlist of attributes to include in markdown (if not provided, all attributes are included) */\n allowedAttributes?: string[]\n}\n\n/**\n * Creates a complete markdown spec for block-level nodes using Pandoc syntax.\n *\n * The generated spec handles:\n * - Parsing blocks with `:::blockName {attributes}` syntax\n * - Extracting and parsing attributes\n * - Rendering blocks back to markdown with proper formatting\n * - Nested content support\n *\n * @param options - Configuration for the block markdown spec\n * @returns Complete markdown specification object\n *\n * @example\n * ```ts\n * const calloutSpec = createBlockMarkdownSpec({\n * nodeName: 'callout',\n * defaultAttributes: { type: 'info' },\n * allowedAttributes: ['type', 'title'] // Only these get rendered to markdown\n * })\n *\n * // Usage in extension:\n * export const Callout = Node.create({\n * // ... other config\n * markdown: calloutSpec\n * })\n * ```\n */\nexport function createBlockMarkdownSpec(options: BlockMarkdownSpecOptions): {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => MarkdownParseResult\n markdownTokenizer: MarkdownTokenizer\n renderMarkdown: (node: JSONContent, h: MarkdownRendererHelpers) => string\n} {\n const {\n nodeName,\n name: markdownName,\n getContent,\n parseAttributes = defaultParseAttributes,\n serializeAttributes = defaultSerializeAttributes,\n defaultAttributes = {},\n content = 'block',\n allowedAttributes,\n } = options\n\n // Use markdownName for syntax, fallback to nodeName\n const blockName = markdownName || nodeName\n\n // Helper function to filter attributes based on allowlist\n const filterAttributes = (attrs: Record<string, any>) => {\n if (!allowedAttributes) {\n return attrs\n }\n\n const filtered: Record<string, any> = {}\n allowedAttributes.forEach(key => {\n if (key in attrs) {\n filtered[key] = attrs[key]\n }\n })\n return filtered\n }\n\n return {\n parseMarkdown: (token, h) => {\n let nodeContent: JSONContent[]\n\n if (getContent) {\n const contentResult = getContent(token)\n // If getContent returns a string, wrap it in a text node\n nodeContent =\n typeof contentResult === 'string'\n ? [{ type: 'text', text: contentResult }]\n : contentResult\n } else if (content === 'block') {\n nodeContent = h.parseChildren(token.tokens || [])\n } else {\n nodeContent = h.parseInline(token.tokens || [])\n }\n\n const attrs = { ...defaultAttributes, ...token.attributes }\n\n return h.createNode(nodeName, attrs, nodeContent)\n },\n\n markdownTokenizer: {\n name: nodeName,\n level: 'block' as const,\n start(src) {\n const regex = new RegExp(`^:::${blockName}`, 'm')\n const index = src.match(regex)?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, _tokens, lexer) {\n // Match the opening tag with optional attributes\n const openingRegex = new RegExp(`^:::${blockName}(?:\\\\s+\\\\{([^}]*)\\\\})?\\\\s*\\\\n`)\n const openingMatch = src.match(openingRegex)\n\n if (!openingMatch) {\n return undefined\n }\n\n const [openingTag, attrString = ''] = openingMatch\n const attributes = parseAttributes(attrString)\n\n // Find the matching closing tag by tracking nesting level\n let level = 1\n const position = openingTag.length\n let matchedContent = ''\n\n // Pattern to match any block opening (:::word) or closing (:::)\n const blockPattern = /^:::([\\w-]*)(\\s.*)?/gm\n const remaining = src.slice(position)\n\n blockPattern.lastIndex = 0\n\n // run until no more matches are found\n for (;;) {\n const match = blockPattern.exec(remaining)\n if (match === null) {\n break\n }\n const matchPos = match.index\n const blockType = match[1] // Empty string for closing tag, block name for opening\n\n if (match[2]?.endsWith(':::')) {\n // this is an atom ::: node, we skip it\n continue\n }\n\n if (blockType) {\n // Opening tag found - increase level\n level += 1\n } else {\n // Closing tag found - decrease level\n level -= 1\n\n if (level === 0) {\n // Found our matching closing tag\n // Don't trim yet - keep newlines for tokenizer regex matching\n const rawContent = remaining.slice(0, matchPos)\n matchedContent = rawContent.trim()\n const fullMatch = src.slice(0, position + matchPos + match[0].length)\n\n // Tokenize the content\n let contentTokens: MarkdownToken[] = []\n if (matchedContent) {\n if (content === 'block') {\n // Use rawContent for tokenization to preserve line boundaries for regex matching\n contentTokens = lexer.blockTokens(rawContent)\n\n // Parse inline tokens for any token that has text content but no tokens\n contentTokens.forEach(token => {\n if (token.text && (!token.tokens || token.tokens.length === 0)) {\n token.tokens = lexer.inlineTokens(token.text)\n }\n })\n\n // Clean up empty trailing paragraphs\n while (contentTokens.length > 0) {\n const lastToken = contentTokens[contentTokens.length - 1]\n if (\n lastToken.type === 'paragraph' &&\n (!lastToken.text || lastToken.text.trim() === '')\n ) {\n contentTokens.pop()\n } else {\n break\n }\n }\n } else {\n contentTokens = lexer.inlineTokens(matchedContent)\n }\n }\n\n return {\n type: nodeName,\n raw: fullMatch,\n attributes,\n content: matchedContent,\n tokens: contentTokens,\n }\n }\n }\n }\n\n // No matching closing tag found\n return undefined\n },\n },\n\n renderMarkdown: (node, h) => {\n const filteredAttrs = filterAttributes(node.attrs || {})\n const attrs = serializeAttributes(filteredAttrs)\n const attrString = attrs ? ` {${attrs}}` : ''\n const renderedContent = h.renderChildren(node.content || [], '\\n\\n')\n\n return `:::${blockName}${attrString}\\n\\n${renderedContent}\\n\\n:::`\n },\n }\n}\n","import type {\n JSONContent,\n MarkdownParseHelpers,\n MarkdownParseResult,\n MarkdownToken,\n MarkdownTokenizer,\n} from '../../types.js'\n\n/**\n * Parse shortcode attributes like 'id=\"madonna\" handle=\"john\" name=\"John Doe\"'\n * Requires all values to be quoted with either single or double quotes\n */\nfunction parseShortcodeAttributes(attrString: string): Record<string, any> {\n if (!attrString.trim()) {\n return {}\n }\n\n const attributes: Record<string, any> = {}\n // Match key=value pairs, only accepting quoted values\n const regex = /(\\w+)=(?:\"([^\"]*)\"|'([^']*)')/g\n let match = regex.exec(attrString)\n\n while (match !== null) {\n const [, key, doubleQuoted, singleQuoted] = match\n attributes[key] = doubleQuoted || singleQuoted\n match = regex.exec(attrString)\n }\n\n return attributes\n}\n\n/**\n * Serialize attributes back to shortcode format\n * Always quotes all values with double quotes\n */\nfunction serializeShortcodeAttributes(attrs: Record<string, any>): string {\n return Object.entries(attrs)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=\"${value}\"`)\n .join(' ')\n}\n\n/**\n * Configuration for an allowed attribute in markdown serialization.\n * Can be a simple string (attribute name) or an object with additional options.\n */\nexport type AllowedAttribute =\n | string\n | {\n /** The attribute name */\n name: string\n /**\n * If provided, the attribute will be skipped during serialization when its value\n * equals this default value. This keeps markdown output clean by omitting\n * attributes that have their default values.\n */\n skipIfDefault?: any\n }\n\nexport interface InlineMarkdownSpecOptions {\n /** The Tiptap node name this spec is for */\n nodeName: string\n /** The shortcode name (defaults to nodeName if not provided) */\n name?: string\n /** Function to extract content from the node for serialization */\n getContent?: (node: any) => string\n /** Function to parse attributes from the attribute string */\n parseAttributes?: (attrString: string) => Record<string, any>\n /** Function to serialize attributes to string */\n serializeAttributes?: (attrs: Record<string, any>) => string\n /** Default attributes to apply when parsing */\n defaultAttributes?: Record<string, any>\n /** Whether this is a self-closing shortcode (no content, like [emoji name=party]) */\n selfClosing?: boolean\n /**\n * Allowlist of attributes to include in markdown serialization.\n * If not provided, all attributes are included.\n *\n * Each item can be either:\n * - A string: the attribute name (always included if present)\n * - An object: `{ name: string, skipIfDefault?: any }` for conditional inclusion\n *\n * @example\n * // Simple string attributes (backward compatible)\n * allowedAttributes: ['id', 'label']\n *\n * // Mixed with conditional attributes\n * allowedAttributes: [\n * 'id',\n * 'label',\n * { name: 'mentionSuggestionChar', skipIfDefault: '@' }\n * ]\n */\n allowedAttributes?: AllowedAttribute[]\n}\n\n/**\n * Creates a complete markdown spec for inline nodes using attribute syntax.\n *\n * The generated spec handles:\n * - Parsing shortcode syntax with `[nodeName attributes]content[/nodeName]` format\n * - Self-closing shortcodes like `[emoji name=party_popper]`\n * - Extracting and parsing attributes from the opening tag\n * - Rendering inline elements back to shortcode markdown\n * - Supporting both content-based and self-closing inline elements\n *\n * @param options - Configuration for the inline markdown spec\n * @returns Complete markdown specification object\n *\n * @example\n * ```ts\n * // Self-closing mention: [mention id=\"madonna\" label=\"Madonna\"]\n * const mentionSpec = createInlineMarkdownSpec({\n * nodeName: 'mention',\n * selfClosing: true,\n * defaultAttributes: { type: 'user' },\n * allowedAttributes: ['id', 'label'] // Only these get rendered to markdown\n * })\n *\n * // Self-closing emoji: [emoji name=\"party_popper\"]\n * const emojiSpec = createInlineMarkdownSpec({\n * nodeName: 'emoji',\n * selfClosing: true,\n * allowedAttributes: ['name']\n * })\n *\n * // With content: [highlight color=\"yellow\"]text[/highlight]\n * const highlightSpec = createInlineMarkdownSpec({\n * nodeName: 'highlight',\n * selfClosing: false,\n * allowedAttributes: ['color', 'style']\n * })\n *\n * // Usage in extension:\n * export const Mention = Node.create({\n * name: 'mention', // Must match nodeName\n * // ... other config\n * markdown: mentionSpec\n * })\n * ```\n */\nexport function createInlineMarkdownSpec(options: InlineMarkdownSpecOptions): {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => MarkdownParseResult\n markdownTokenizer: MarkdownTokenizer\n renderMarkdown: (node: JSONContent) => string\n} {\n const {\n nodeName,\n name: shortcodeName,\n getContent,\n parseAttributes = parseShortcodeAttributes,\n serializeAttributes = serializeShortcodeAttributes,\n defaultAttributes = {},\n selfClosing = false,\n allowedAttributes,\n } = options\n\n // Use shortcodeName for markdown syntax, fallback to nodeName\n const shortcode = shortcodeName || nodeName\n\n // Helper function to filter attributes based on allowlist\n const filterAttributes = (attrs: Record<string, any>) => {\n if (!allowedAttributes) {\n return attrs\n }\n\n const filtered: Record<string, any> = {}\n allowedAttributes.forEach(attr => {\n // Handle both string and object formats for backward compatibility\n const attrName = typeof attr === 'string' ? attr : attr.name\n const skipIfDefault = typeof attr === 'string' ? undefined : attr.skipIfDefault\n\n if (attrName in attrs) {\n const value = attrs[attrName]\n\n // Skip if value equals the default (when skipIfDefault is specified)\n if (skipIfDefault !== undefined && value === skipIfDefault) {\n return\n }\n\n filtered[attrName] = value\n }\n })\n return filtered\n }\n\n // Escape special regex characters in shortcode name\n const escapedShortcode = shortcode.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n return {\n parseMarkdown: (token: MarkdownToken, h: MarkdownParseHelpers) => {\n const attrs = { ...defaultAttributes, ...token.attributes }\n\n if (selfClosing) {\n // Self-closing nodes like mentions are atomic - no content\n return h.createNode(nodeName, attrs)\n }\n\n // Nodes with content\n const content = getContent ? getContent(token) : token.content || ''\n if (content) {\n // For inline content, create text nodes using the proper helper\n return h.createNode(nodeName, attrs, [h.createTextNode(content)])\n }\n return h.createNode(nodeName, attrs, [])\n },\n\n markdownTokenizer: {\n name: nodeName,\n level: 'inline' as const,\n start(src: string) {\n // Create a non-global version for finding the start position\n const startPattern = selfClosing\n ? new RegExp(`\\\\[${escapedShortcode}\\\\s*[^\\\\]]*\\\\]`)\n : new RegExp(`\\\\[${escapedShortcode}\\\\s*[^\\\\]]*\\\\][\\\\s\\\\S]*?\\\\[\\\\/${escapedShortcode}\\\\]`)\n\n const match = src.match(startPattern)\n const index = match?.index\n return index !== undefined ? index : -1\n },\n tokenize(src, _tokens, _lexer) {\n // Use non-global regex to match from the start of the string\n const tokenPattern = selfClosing\n ? new RegExp(`^\\\\[${escapedShortcode}\\\\s*([^\\\\]]*)\\\\]`)\n : new RegExp(\n `^\\\\[${escapedShortcode}\\\\s*([^\\\\]]*)\\\\]([\\\\s\\\\S]*?)\\\\[\\\\/${escapedShortcode}\\\\]`,\n )\n\n const match = src.match(tokenPattern)\n\n if (!match) {\n return undefined\n }\n\n let content = ''\n let attrString = ''\n\n if (selfClosing) {\n // Self-closing: [shortcode attr=\"value\"]\n const [, attrs] = match\n attrString = attrs\n } else {\n // With content: [shortcode attr=\"value\"]content[/shortcode]\n const [, attrs, contentMatch] = match\n attrString = attrs\n content = contentMatch || ''\n }\n\n // Parse attributes from the attribute string\n const attributes = parseAttributes(attrString.trim())\n\n return {\n type: nodeName,\n raw: match[0],\n content: content.trim(),\n attributes,\n }\n },\n },\n\n renderMarkdown: (node: JSONContent) => {\n let content = ''\n if (getContent) {\n content = getContent(node)\n } else if (node.content && node.content.length > 0) {\n // Extract text from content array for inline nodes\n content = node.content\n .filter((child: any) => child.type === 'text')\n .map((child: any) => child.text)\n .join('')\n }\n\n const filteredAttrs = filterAttributes(node.attrs || {})\n const attrs = serializeAttributes(filteredAttrs)\n const attrString = attrs ? ` ${attrs}` : ''\n\n if (selfClosing) {\n return `[${shortcode}${attrString}]`\n }\n\n return `[${shortcode}${attrString}]${content}[/${shortcode}]`\n },\n }\n}\n","/**\n * @fileoverview Utility for parsing indented markdown blocks with hierarchical nesting.\n *\n * This utility handles the complex logic of parsing markdown blocks that can contain\n * nested content based on indentation levels, maintaining proper hierarchical structure\n * for lists, task lists, and other indented block types.\n */\n\nexport interface ParsedBlock {\n type: string\n raw: string\n mainContent: string\n indentLevel: number\n nestedContent?: string\n nestedTokens?: any[]\n [key: string]: any\n}\n\nexport interface BlockParserConfig {\n /** Regex pattern to match block items */\n itemPattern: RegExp\n /** Function to extract data from regex match */\n extractItemData: (match: RegExpMatchArray) => {\n mainContent: string\n indentLevel: number\n [key: string]: any\n }\n /** Function to create the final token */\n createToken: (data: any, nestedTokens?: any[]) => ParsedBlock\n /** Base indentation to remove from nested content (default: 2 spaces) */\n baseIndentSize?: number\n /**\n * Custom parser for nested content. If provided, this will be called instead\n * of the default lexer.blockTokens() for parsing nested content.\n * This allows recursive parsing of the same block type.\n */\n customNestedParser?: (dedentedContent: string) => any[] | undefined\n}\n\n/**\n * Parses markdown text into hierarchical indented blocks with proper nesting.\n *\n * This utility handles:\n * - Line-by-line parsing with pattern matching\n * - Hierarchical nesting based on indentation levels\n * - Nested content collection and parsing\n * - Empty line handling\n * - Content dedenting for nested blocks\n *\n * The key difference from flat parsing is that this maintains the hierarchical\n * structure where nested items become `nestedTokens` of their parent items,\n * rather than being flattened into a single array.\n *\n * @param src - The markdown source text to parse\n * @param config - Configuration object defining how to parse and create tokens\n * @param lexer - Markdown lexer for parsing nested content\n * @returns Parsed result with hierarchical items, or undefined if no matches\n *\n * @example\n * ```ts\n * const result = parseIndentedBlocks(src, {\n * itemPattern: /^(\\s*)([-+*])\\s+\\[([ xX])\\]\\s+(.*)$/,\n * extractItemData: (match) => ({\n * indentLevel: match[1].length,\n * mainContent: match[4],\n * checked: match[3].toLowerCase() === 'x'\n * }),\n * createToken: (data, nestedTokens) => ({\n * type: 'taskItem',\n * checked: data.checked,\n * text: data.mainContent,\n * nestedTokens\n * })\n * }, lexer)\n * ```\n */\nexport function parseIndentedBlocks(\n src: string,\n config: BlockParserConfig,\n lexer: {\n inlineTokens: (src: string) => any[]\n blockTokens: (src: string) => any[]\n },\n):\n | {\n items: ParsedBlock[]\n raw: string\n }\n | undefined {\n const lines = src.split('\\n')\n const items: ParsedBlock[] = []\n let totalRaw = ''\n let i = 0\n const baseIndentSize = config.baseIndentSize || 2\n\n while (i < lines.length) {\n const currentLine = lines[i]\n const itemMatch = currentLine.match(config.itemPattern)\n\n if (!itemMatch) {\n // Not a matching item - stop if we have items, otherwise this isn't our block type\n if (items.length > 0) {\n break\n } else if (currentLine.trim() === '') {\n i += 1\n totalRaw = `${totalRaw}${currentLine}\\n`\n continue\n } else {\n return undefined\n }\n }\n\n const itemData = config.extractItemData(itemMatch)\n const { indentLevel, mainContent } = itemData\n totalRaw = `${totalRaw}${currentLine}\\n`\n\n // Collect content for this item (including nested items)\n const itemContent = [mainContent] // Start with the main text\n i += 1\n\n // Look ahead for nested content (indented more than current item)\n while (i < lines.length) {\n const nextLine = lines[i]\n\n if (nextLine.trim() === '') {\n // Empty line - might be end of nested content\n const nextNonEmptyIndex = lines.slice(i + 1).findIndex(l => l.trim() !== '')\n if (nextNonEmptyIndex === -1) {\n // No more content\n break\n }\n\n const nextNonEmpty = lines[i + 1 + nextNonEmptyIndex]\n const nextIndent = nextNonEmpty.match(/^(\\s*)/)?.[1]?.length || 0\n\n if (nextIndent > indentLevel) {\n // Nested content continues after empty line\n itemContent.push(nextLine)\n totalRaw = `${totalRaw}${nextLine}\\n`\n i += 1\n continue\n } else {\n // End of nested content\n break\n }\n }\n\n const nextIndent = nextLine.match(/^(\\s*)/)?.[1]?.length || 0\n\n if (nextIndent > indentLevel) {\n // This is nested content for the current item\n itemContent.push(nextLine)\n totalRaw = `${totalRaw}${nextLine}\\n`\n i += 1\n } else {\n // Same or less indentation - this belongs to parent level\n break\n }\n }\n\n // Parse nested content if present\n let nestedTokens: any[] | undefined\n const nestedContent = itemContent.slice(1)\n\n if (nestedContent.length > 0) {\n // Remove the base indentation from nested content\n const dedentedNested = nestedContent\n .map(nestedLine => nestedLine.slice(indentLevel + baseIndentSize)) // Remove base indent + 2 spaces\n .join('\\n')\n\n if (dedentedNested.trim()) {\n // Use custom nested parser if provided, otherwise fall back to default\n if (config.customNestedParser) {\n nestedTokens = config.customNestedParser(dedentedNested)\n } else {\n nestedTokens = lexer.blockTokens(dedentedNested)\n }\n }\n }\n\n // Create the token using the provided factory function\n const token = config.createToken(itemData, nestedTokens)\n items.push(token)\n }\n\n if (items.length === 0) {\n return undefined\n }\n\n return {\n items,\n raw: totalRaw,\n }\n}\n","import type { JSONContent } from '@tiptap/core'\n\n/**\n * @fileoverview Utility functions for rendering nested content in markdown.\n *\n * This module provides reusable utilities for extensions that need to render\n * content with a prefix on the main line and properly indented nested content.\n */\n\n/**\n * Utility function for rendering content with a main line prefix and nested indented content.\n *\n * This function handles the common pattern of rendering content with:\n * 1. A main line with a prefix (like \"- \" for lists, \"> \" for blockquotes, etc.)\n * 2. Nested content that gets indented properly\n *\n * @param node - The ProseMirror node representing the content\n * @param h - The markdown renderer helper\n * @param prefixOrGenerator - Either a string prefix or a function that generates the prefix from context\n * @param ctx - Optional context object (used when prefixOrGenerator is a function)\n * @returns The rendered markdown string\n *\n * @example\n * ```ts\n * // For a bullet list item with static prefix\n * return renderNestedMarkdownContent(node, h, '- ')\n *\n * // For a task item with static prefix\n * const prefix = `- [${node.attrs?.checked ? 'x' : ' '}] `\n * return renderNestedMarkdownContent(node, h, prefix)\n *\n * // For a blockquote with static prefix\n * return renderNestedMarkdownContent(node, h, '> ')\n *\n * // For content with dynamic prefix based on context\n * return renderNestedMarkdownContent(node, h, ctx => {\n * if (ctx.parentType === 'orderedList') {\n * return `${ctx.index + 1}. `\n * }\n * return '- '\n * }, ctx)\n *\n * // Custom extension example\n * const CustomContainer = Node.create({\n * name: 'customContainer',\n * // ... other config\n * markdown: {\n * render: (node, h) => {\n * const type = node.attrs?.type || 'info'\n * return renderNestedMarkdownContent(node, h, `[${type}] `)\n * }\n * }\n * })\n * ```\n */\nexport function renderNestedMarkdownContent(\n node: JSONContent,\n h: {\n renderChildren: (nodes: JSONContent[]) => string\n renderChild?: (node: JSONContent, index: number) => string\n indent: (text: string) => string\n },\n prefixOrGenerator: string | ((ctx: any) => string),\n ctx?: any,\n): string {\n if (!node || !Array.isArray(node.content)) {\n return ''\n }\n\n // Determine the prefix based on the input\n const prefix =\n typeof prefixOrGenerator === 'function' ? prefixOrGenerator(ctx) : prefixOrGenerator\n\n const [content, ...children] = node.content\n\n // Render the main content (typically a paragraph)\n const mainContent = h.renderChildren([content])\n let output = `${prefix}${mainContent}`\n\n // Handle nested children with proper indentation\n if (children && children.length > 0) {\n children.forEach((child, index) => {\n const childContent = h.renderChild?.(child, index + 1) ?? h.renderChildren([child])\n if (childContent !== undefined && childContent !== null) {\n // Split the child content by lines and indent each line\n const indentedChild = childContent\n .split('\\n')\n .map(line => (line ? h.indent(line) : h.indent('')))\n .join('\\n')\n\n output += child.type === 'paragraph' ? `\\n\\n${indentedChild}` : `\\n${indentedChild}`\n }\n })\n }\n\n return output\n}\n","import type { DOMOutputSpec, Node as ProseMirrorNode, NodeSpec, NodeType } from '@tiptap/pm/model'\n\nimport type { Editor } from './Editor.js'\nimport type { ExtendableConfig } from './Extendable.js'\nimport { Extendable } from './Extendable.js'\nimport type { Attributes, NodeViewRenderer, ParentConfig } from './types.js'\n\nexport interface NodeConfig<Options = any, Storage = any> extends ExtendableConfig<\n Options,\n Storage,\n NodeConfig<Options, Storage>,\n NodeType\n> {\n /**\n * Node View\n */\n addNodeView?:\n | ((this: {\n name: string\n options: Options\n storage: Storage\n editor: Editor\n type: NodeType\n parent: ParentConfig<NodeConfig<Options, Storage>>['addNodeView']\n }) => NodeViewRenderer | null)\n | null\n\n /**\n * Defines if this node should be a top level node (doc)\n * @default false\n * @example true\n */\n topNode?: boolean\n\n /**\n * The content expression for this node, as described in the [schema\n * guide](/docs/guide/#schema.content_expressions). When not given,\n * the node does not allow any content.\n *\n * You can read more about it on the Prosemirror documentation here\n * @see https://prosemirror.net/docs/guide/#schema.content_expressions\n * @default undefined\n * @example content: 'block+'\n * @example content: 'headline paragraph block*'\n */\n content?:\n | NodeSpec['content']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['content']\n editor?: Editor\n }) => NodeSpec['content'])\n\n /**\n * The marks that are allowed inside of this node. May be a\n * space-separated string referring to mark names or groups, `\"_\"`\n * to explicitly allow all marks, or `\"\"` to disallow marks. When\n * not given, nodes with inline content default to allowing all\n * marks, other nodes default to not allowing marks.\n *\n * @example marks: 'strong em'\n */\n marks?:\n | NodeSpec['marks']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['marks']\n editor?: Editor\n }) => NodeSpec['marks'])\n\n /**\n * The group or space-separated groups to which this node belongs,\n * which can be referred to in the content expressions for the\n * schema.\n *\n * By default Tiptap uses the groups 'block' and 'inline' for nodes. You\n * can also use custom groups if you want to group specific nodes together\n * and handle them in your schema.\n * @example group: 'block'\n * @example group: 'inline'\n * @example group: 'customBlock' // this uses a custom group\n */\n group?:\n | NodeSpec['group']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['group']\n editor?: Editor\n }) => NodeSpec['group'])\n\n /**\n * Should be set to true for inline nodes. (Implied for text nodes.)\n */\n inline?:\n | NodeSpec['inline']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['inline']\n editor?: Editor\n }) => NodeSpec['inline'])\n\n /**\n * Can be set to true to indicate that, though this isn't a [leaf\n * node](https://prosemirror.net/docs/ref/#model.NodeType.isLeaf), it doesn't have directly editable\n * content and should be treated as a single unit in the view.\n *\n * @example atom: true\n */\n atom?:\n | NodeSpec['atom']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['atom']\n editor?: Editor\n }) => NodeSpec['atom'])\n\n /**\n * Controls whether nodes of this type can be selected as a [node\n * selection](https://prosemirror.net/docs/ref/#state.NodeSelection). Defaults to true for non-text\n * nodes.\n *\n * @default true\n * @example selectable: false\n */\n selectable?:\n | NodeSpec['selectable']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['selectable']\n editor?: Editor\n }) => NodeSpec['selectable'])\n\n /**\n * Determines whether nodes of this type can be dragged without\n * being selected. Defaults to false.\n *\n * @default: false\n * @example: draggable: true\n */\n draggable?:\n | NodeSpec['draggable']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['draggable']\n editor?: Editor\n }) => NodeSpec['draggable'])\n\n /**\n * Can be used to indicate that this node contains code, which\n * causes some commands to behave differently.\n */\n code?:\n | NodeSpec['code']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['code']\n editor?: Editor\n }) => NodeSpec['code'])\n\n /**\n * Controls way whitespace in this a node is parsed. The default is\n * `\"normal\"`, which causes the [DOM parser](https://prosemirror.net/docs/ref/#model.DOMParser) to\n * collapse whitespace in normal mode, and normalize it (replacing\n * newlines and such with spaces) otherwise. `\"pre\"` causes the\n * parser to preserve spaces inside the node. When this option isn't\n * given, but [`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) is true, `whitespace`\n * will default to `\"pre\"`. Note that this option doesn't influence\n * the way the node is rendered—that should be handled by `toDOM`\n * and/or styling.\n */\n whitespace?:\n | NodeSpec['whitespace']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['whitespace']\n editor?: Editor\n }) => NodeSpec['whitespace'])\n\n /**\n * Allows a **single** node to be set as linebreak equivalent (e.g. hardBreak).\n * When converting between block types that have whitespace set to \"pre\"\n * and don't support the linebreak node (e.g. codeBlock) and other block types\n * that do support the linebreak node (e.g. paragraphs) - this node will be used\n * as the linebreak instead of stripping the newline.\n *\n * See [linebreakReplacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement).\n */\n linebreakReplacement?:\n | NodeSpec['linebreakReplacement']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['linebreakReplacement']\n editor?: Editor\n }) => NodeSpec['linebreakReplacement'])\n\n /**\n * When enabled, enables both\n * [`definingAsContext`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext) and\n * [`definingForContent`](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n *\n * @default false\n * @example isolating: true\n */\n defining?:\n | NodeSpec['defining']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['defining']\n editor?: Editor\n }) => NodeSpec['defining'])\n\n /**\n * When enabled (default is false), the sides of nodes of this type\n * count as boundaries that regular editing operations, like\n * backspacing or lifting, won't cross. An example of a node that\n * should probably have this enabled is a table cell.\n */\n isolating?:\n | NodeSpec['isolating']\n | ((this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['isolating']\n editor?: Editor\n }) => NodeSpec['isolating'])\n\n /**\n * Associates DOM parser information with this node, which can be\n * used by [`DOMParser.fromSchema`](https://prosemirror.net/docs/ref/#model.DOMParser^fromSchema) to\n * automatically derive a parser. The `node` field in the rules is\n * implied (the name of this node will be filled in automatically).\n * If you supply your own parser, you do not need to also specify\n * parsing rules in your schema.\n *\n * @example parseHTML: [{ tag: 'div', attrs: { 'data-id': 'my-block' } }]\n */\n parseHTML?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['parseHTML']\n editor?: Editor\n }) => NodeSpec['parseDOM']\n\n /**\n * A description of a DOM structure. Can be either a string, which is\n * interpreted as a text node, a DOM node, which is interpreted as\n * itself, a `{dom, contentDOM}` object, or an array.\n *\n * An array describes a DOM element. The first value in the array\n * should be a string—the name of the DOM element, optionally prefixed\n * by a namespace URL and a space. If the second element is plain\n * object, it is interpreted as a set of attributes for the element.\n * Any elements after that (including the 2nd if it's not an attribute\n * object) are interpreted as children of the DOM elements, and must\n * either be valid `DOMOutputSpec` values, or the number zero.\n *\n * The number zero (pronounced “hole”) is used to indicate the place\n * where a node's child nodes should be inserted. If it occurs in an\n * output spec, it should be the only child element in its parent\n * node.\n *\n * @example toDOM: ['div[data-id=\"my-block\"]', { class: 'my-block' }, 0]\n */\n renderHTML?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['renderHTML']\n editor?: Editor\n },\n props: {\n node: ProseMirrorNode\n HTMLAttributes: Record<string, any>\n },\n ) => DOMOutputSpec)\n | null\n\n /**\n * renders the node as text\n * @example renderText: () => 'foo\n */\n renderText?:\n | ((\n this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['renderText']\n editor?: Editor\n },\n props: {\n node: ProseMirrorNode\n pos: number\n parent: ProseMirrorNode\n index: number\n },\n ) => string)\n | null\n\n /**\n * Add attributes to the node\n * @example addAttributes: () => ({ class: 'foo' })\n */\n addAttributes?: (this: {\n name: string\n options: Options\n storage: Storage\n parent: ParentConfig<NodeConfig<Options, Storage>>['addAttributes']\n editor?: Editor\n // oxlint-disable-next-lineno-empty-object-type\n }) => Attributes | {}\n}\n\n/**\n * The Node class is used to create custom node extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nexport class Node<Options = any, Storage = any> extends Extendable<\n Options,\n Storage,\n NodeConfig<Options, Storage>\n> {\n type = 'node'\n\n /**\n * Create a new Node instance\n * @param config - Node configuration object or a function that returns a configuration object\n */\n static create<O = any, S = any>(\n config: Partial<NodeConfig<O, S>> | (() => Partial<NodeConfig<O, S>>) = {},\n ) {\n // If the config is a function, execute it to get the configuration object\n const resolvedConfig = typeof config === 'function' ? config() : config\n return new Node<O, S>(resolvedConfig)\n }\n\n configure(options?: Partial<Options>) {\n return super.configure(options) as Node<Options, Storage>\n }\n\n extend<\n ExtendedOptions = Options,\n ExtendedStorage = Storage,\n ExtendedConfig extends NodeConfig<ExtendedOptions, ExtendedStorage> = NodeConfig<\n ExtendedOptions,\n ExtendedStorage\n >,\n >(\n extendedConfig?:\n | (() => Partial<ExtendedConfig>)\n | (Partial<ExtendedConfig> &\n ThisType<{\n name: string\n options: ExtendedOptions\n storage: ExtendedStorage\n editor: Editor\n type: NodeType\n }>),\n ): Node<ExtendedOptions, ExtendedStorage> {\n // If the extended config is a function, execute it to get the configuration object\n const resolvedConfig = typeof extendedConfig === 'function' ? extendedConfig() : extendedConfig\n return super.extend(resolvedConfig) as Node<ExtendedOptions, ExtendedStorage>\n }\n}\n","import { Mark } from \"@tiptap/core\";\n\nexport const Highlight = Mark.create({\n name: \"highlight\",\n\n renderHTML({ HTMLAttributes }) {\n return [\"mark\", { style: \"background: #fef08a; border-radius: 2px; padding: 0 2px;\", ...HTMLAttributes }, 0];\n },\n\n parseHTML() {\n return [{ tag: \"mark\" }];\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-Shift-h\": () => this.editor.commands.toggleMark(this.name),\n };\n },\n});\n","import React from \"react\";\nimport { useCurrentEditor } from \"@tiptap/react\";\nimport styles from \"../RichTextEditor.module.scss\";\n\nconst HighlightIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"1\" y=\"8\" width=\"12\" height=\"3\" rx=\"1\" fill=\"#fef08a\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <path d=\"M4 8L5.5 3h3L10 8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n <line x1=\"4.5\" y1=\"6\" x2=\"9.5\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeLinecap=\"round\" />\n </svg>\n);\n\nexport const HighlightButton: React.FC = () => {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n const active = editor.isActive(\"highlight\");\n\n return (\n <button\n type=\"button\"\n title=\"Highlight (Mod+Shift+H)\"\n aria-label=\"Highlight\"\n aria-pressed={active}\n className={[styles.toolbarButton, active ? styles.active : \"\"].filter(Boolean).join(\" \")}\n onMouseDown={(e) => {\n e.preventDefault();\n editor.chain().focus().toggleMark(\"highlight\").run();\n }}\n >\n <HighlightIcon />\n </button>\n );\n};\n","import { Node, mergeAttributes } from \"@tiptap/core\";\n\nexport const PageBreak = Node.create({\n name: \"pageBreak\",\n group: \"block\",\n atom: true,\n\n parseHTML() {\n return [{ tag: 'div[data-type=\"page-break\"]' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"div\", mergeAttributes(HTMLAttributes, { \"data-type\": \"page-break\" })];\n },\n\n addKeyboardShortcuts() {\n return {\n \"Mod-Enter\": () => this.editor.commands.insertContent({ type: this.name }),\n };\n },\n});\n","import React from \"react\";\nimport { useCurrentEditor } from \"@tiptap/react\";\nimport styles from \"../RichTextEditor.module.scss\";\n\nconst PageBreakIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"1\" width=\"10\" height=\"6\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"3\" y=\"9\" width=\"10\" height=\"6\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <line x1=\"1\" y1=\"8\" x2=\"5\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeDasharray=\"1.5 1.5\" />\n <line x1=\"7\" y1=\"8\" x2=\"9\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeDasharray=\"1.5 1.5\" />\n <line x1=\"11\" y1=\"8\" x2=\"15\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeDasharray=\"1.5 1.5\" />\n </svg>\n);\n\nexport const PageBreakButton: React.FC = () => {\n const { editor } = useCurrentEditor();\n if (!editor) return null;\n\n return (\n <button\n type=\"button\"\n title=\"Page break (Mod+Enter)\"\n aria-label=\"Insert page break\"\n className={styles.toolbarButton}\n onMouseDown={(e) => {\n e.preventDefault();\n editor.chain().focus().insertContent({ type: \"pageBreak\" }).run();\n }}\n >\n <PageBreakIcon />\n </button>\n );\n};\n",".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.recentsEmpty {\n background: transparent;\n box-shadow: none;\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.chipWrapRemoving {\n animation: chipOut 0.22s cubic-bezier(0.4, 0, 1, 1) both;\n pointer-events: none;\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@keyframes chipOut {\n 0% {\n transform: scale(1) rotate(0);\n opacity: 1;\n }\n 100% {\n transform: scale(0) rotate(18deg);\n opacity: 0;\n }\n}\n.picker {\n position: relative;\n margin-top: 96px;\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% - 170px));\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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbG9yV2hlZWwubW9kdWxlLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUNBO0VBMUJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBb0JBO0VBQ0U7SUFsQkY7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTs7O0FBa0JBO0VBekNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBa0NBO0VBL0JBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBMEJBO0VBcENBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBNkJBO0VBcERBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBZ0JGO0VBOEJFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0lBQ0U7SUFDQTs7O0FBS0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFhRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFPRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7QUFFRjtFQUNFOzs7QUFNSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTs7QUFFRjtFQUNFOztBQUVGO0VBQ0U7RUFDQTtFQUNBOzs7QUFJSjtFQUNFO0lBQUs7SUFBb0M7O0VBQ3pDO0lBQU87SUFBK0I7OztBQUd4QztFQUNFO0lBQUs7SUFBK0I7O0VBQ3BDO0lBQU87SUFBbUM7OztBQVc1QztFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBSUY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7O0FBRUY7RUFDRTs7O0FBS0o7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBT0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFFQTtFQUNBOzs7QUFLRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFJQTtFQUlBOzs7QUFFRjtFQUNFOzs7QUFFRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQWNGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFO0VBQ0E7RUFDQTtFQUNBLFdBdEJROzs7QUF5QlY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLFdBcENROzs7QUF1Q1Y7RUFDRTtFQUNBOzs7QUFTRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBRUY7RUFDRTs7O0FBR0Y7RUFDRTs7O0FBS0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFFRjtFQUNFOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxrQkFDRTtFQUVGO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBOzs7QUFLRjtBQUFBO0VBRUU7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7OztBQUdKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOzs7QUFRSjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUVGO0VBQ0U7RUFDQTs7O0FBR0o7RUFDRTs7QUFDQTtFQUNFOztBQUVGO0VBQ0U7OztBQUdKO0VBQ0U7O0FBQ0E7RUFDRTs7O0FBR0o7RUFDRTtJQUFLOztFQUNMO0lBQU07O0VBQ047SUFBTyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRoZW1lIHRva2VucyBhcmUgc2NvcGVkIHRvIC5yb290IChjb21wb25lbnQtbG9jYWwpLCBub3QgOnJvb3QgLS0gdGhpc1xuLy8gY29tcG9uZW50IG11c3QgYmUgc2FmZSB0byBkcm9wIGludG8gYW4gYXBwIHdpdGggaXRzIG93biBnbG9iYWwgdGhlbWVcbi8vIHdpdGhvdXQgY29sbGlkaW5nLiBBbGwgKmNvbXB1dGVkKiBjb2xvcnMgKHRoZSBjb2xvciB5b3UncmUgcGlja2luZywgYmFkZ2Vcbi8vIHRpbnRzLCBncmFkaWVudHMpIGFyZSBwYXNzZWQgaW4gYXMgaW5saW5lIHN0eWxlcyBmcm9tIENvbG9yV2hlZWwudHN4LCBub3Rcbi8vIENTUyBjdXN0b20gcHJvcGVydGllcyBoZXJlIC0tIG9ubHkgc3RydWN0dXJhbC90aGVtZSB0b2tlbnMgbGl2ZSBpbiBTQ1NTLlxuXG4vLyBsaWdodC9kYXJrIHBhbGV0dGVzIC0tIGlkZW50aWNhbCB2YWx1ZXMgc2hhcmVkIGJ5IGV2ZXJ5IHRyaWdnZXIgYmVsb3cgKE9TXG4vLyBwcmVmZXJlbmNlLCBob3N0IGFwcCdzIGFtYmllbnQgdGhlbWUsIGFuZCB0aGlzIGluc3RhbmNlJ3Mgb3duIGB0aGVtZWAgcHJvcClcbkBtaXhpbiBsaWdodC1wYWxldHRlIHtcbiAgLS1iZzogI0VDRUFFMztcbiAgLS1zdXJmYWNlOiAjRkZGRkZGO1xuICAtLXN1cmZhY2UtMjogI0UzRTBEODtcbiAgLS1ib3JkZXI6ICNEMkNEQzA7XG4gIC0tdGV4dDogIzFBMTkxMztcbiAgLS10ZXh0LWRpbTogIzcyNkY2NDtcbiAgLS10ZXh0LWZhaW50OiAjQThBMzk4O1xuICAtLXNoYWRvdy1zb2Z0OiAwIDFweCAycHggcmdiYSgzMCwgMjUsIDE1LCAwLjA4KTtcbiAgLS1jaGVjay1hOiAjZDhkNGM4O1xuICAtLWNoZWNrLWI6ICNmNGYyZWM7XG4gIGNvbG9yLXNjaGVtZTogbGlnaHQ7XG59XG5AbWl4aW4gZGFyay1wYWxldHRlIHtcbiAgLS1iZzogIzEzMTIxNztcbiAgLS1zdXJmYWNlOiAjMUMxQjIyO1xuICAtLXN1cmZhY2UtMjogIzI2MjUyRTtcbiAgLS1ib3JkZXI6ICMzNDMzM0Q7XG4gIC0tdGV4dDogI0VDRUFGMDtcbiAgLS10ZXh0LWRpbTogIzhFOEM5OTtcbiAgLS10ZXh0LWZhaW50OiAjNjA1RTZCO1xuICAtLXNoYWRvdy1zb2Z0OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjM1KTtcbiAgLS1jaGVjay1hOiAjMzczNTNmO1xuICAtLWNoZWNrLWI6ICMyMDFmMjY7XG4gIGNvbG9yLXNjaGVtZTogZGFyaztcbn1cblxuLnJvb3Qge1xuICBAaW5jbHVkZSBsaWdodC1wYWxldHRlO1xuXG4gIC8vIHRoZW1lPVwic3lzdGVtXCIgKG5vIGRhdGEtdGhlbWUgb2YgaXRzIG93bik6IGZhbGwgYmFjayB0byB0aGUgT1MgcHJlZmVyZW5jZVxuICBAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7XG4gICAgJjpub3QoW2RhdGEtdGhlbWU9J2xpZ2h0J10pOm5vdChbZGF0YS10aGVtZT0nZGFyayddKSB7XG4gICAgICBAaW5jbHVkZSBkYXJrLXBhbGV0dGU7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhlbWU9XCJzeXN0ZW1cIjogdGhlIGhvc3QgYXBwJ3MgYW1iaWVudCB0aGVtZSAoZGF0YS10aGVtZSBzZXQgb24gYW5cbiAgLy8gYW5jZXN0b3IsIGUuZy4gPGh0bWw+IC0tIHRoZSBzYW1lIGNvbnZlbnRpb24gQ29sb3JQaWNrZXIvVGltZWxpbmUgcmVhZFxuICAvLyBmcm9tKSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGJhcmUgT1MgcHJlZmVyZW5jZSBhYm92ZSB3aGVuIHRoZSBhcHBcbiAgLy8gZGVjbGFyZXMgb25lIC0tIGluY2x1ZGluZyBleHBsaWNpdGx5IG92ZXJyaWRpbmcgaXQgYmFjayB0byBsaWdodCwgc2luY2VcbiAgLy8gdGhlIE9TLXByZWZlcmVuY2UgcnVsZSBhYm92ZSBoYXMgbm8gd2F5IHRvIGtub3cgdGhlIGFwcCBkaXNhZ3JlZXNcbiAgOmdsb2JhbChbZGF0YS10aGVtZT0nbGlnaHQnXSkgJjpub3QoW2RhdGEtdGhlbWU9J2xpZ2h0J10pOm5vdChbZGF0YS10aGVtZT0nZGFyayddKSB7XG4gICAgQGluY2x1ZGUgbGlnaHQtcGFsZXR0ZTtcbiAgfVxuICA6Z2xvYmFsKFtkYXRhLXRoZW1lPSdkYXJrJ10pICY6bm90KFtkYXRhLXRoZW1lPSdsaWdodCddKTpub3QoW2RhdGEtdGhlbWU9J2RhcmsnXSkge1xuICAgIEBpbmNsdWRlIGRhcmstcGFsZXR0ZTtcbiAgfVxuXG4gIC8vIHRoZW1lPVwiZGFya1wiIC8gdGhlbWU9XCJsaWdodFwiOiBwaW5uZWQgZXhwbGljaXRseSBvbiB0aGlzIGluc3RhbmNlLCByZWdhcmRsZXNzIG9mIHRoZSBPUyBvciB0aGUgYXBwXG4gICZbZGF0YS10aGVtZT0nZGFyayddIHtcbiAgICBAaW5jbHVkZSBkYXJrLXBhbGV0dGU7XG4gIH1cbiAgJltkYXRhLXRoZW1lPSdsaWdodCddIHtcbiAgICBAaW5jbHVkZSBsaWdodC1wYWxldHRlO1xuICB9XG5cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDIwcHg7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCAnU2Vnb2UgVUknLCBJbnRlciwgJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGNvbG9yOiB2YXIoLS10ZXh0KTtcbn1cblxuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIHtcbiAgLnJvb3QsIC5yb290ICosIC5yb290ICo6OmJlZm9yZSwgLnJvb3QgKjo6YWZ0ZXIge1xuICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7XG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09IFJlY2VudHMgKGZhdm9yaXRlcykgPT09PT09PT09PT09XG4ucmVjZW50cyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogN3B4O1xuICBtaW4taGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTIpO1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgcGFkZGluZzogNXB4IDhweDtcbiAgYm94LXNoYWRvdzogaW5zZXQgMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksIHZhcigtLXNoYWRvdy1zb2Z0KTtcbiAgLy8gd2lkdGggaXMgbGVmdCB0byBzaHJpbmstdG8tZml0IChub3QgYW5pbWF0ZWQpIC0tIGFuIGV4cGxpY2l0IGB3aWR0aGBcbiAgLy8gdHJhbnNpdGlvbiB3YXMgdHJpZWQgaGVyZSwgYnV0IGEgbmV3bHktYWRkZWQgY2hpcCBtb3VudHMgYXQgZnVsbCBzaXplXG4gIC8vIGltbWVkaWF0ZWx5IChmbGV4LXNocmluayBpcyAwIG9uIC5jaGlwV3JhcCksIHNvIGZvciBhcyBsb25nIGFzIHRoZVxuICAvLyB0cmFuc2l0aW9uIHRha2VzIHRvIGNhdGNoIHVwLCB0aGUgY29udGFpbmVyIGlzIGEgYmVhdCBiZWhpbmQgaXRzIG93blxuICAvLyBjb250ZW50IC0tIGNsaXBwZWQgKGxvb2tzIGxpa2UgdGhlIG5ldyBkb3QgaXMgc3R1Y2svY3V0IG9mZikgb3Igbm90XG4gIC8vICh0aGUgbmV3IGRvdCBvdmVyZmxvd3MgcGFzdCB0aGUgZWRnZSkuIFNuYXBwaW5nIGF2b2lkcyB0aGF0IHdob2xlIGNsYXNzXG4gIC8vIG9mIHRpbWluZyBidWc7IG9ubHkgdGhlIGNoaXBzIHRoZW1zZWx2ZXMgYW5pbWF0ZSBpbi9vdXQgKGNoaXBJbi9jaGlwT3V0KS5cbn1cblxuLy8gc2FtZSBib3ggKG1pbi1oZWlnaHQgKyBwYWRkaW5nKSwganVzdCBpbnZpc2libGUgLS0ga2VlcHMgdGhlIHNsb3Qnc1xuLy8gZm9vdHByaW50IHJlc2VydmVkIHNvIHRoZSByZXN0IG9mIHRoZSBsYXlvdXQgZG9lc24ndCBzaGlmdCB3aGVuIHRoZSBsYXN0XG4vLyBwcmVzZXQgaXMgcmVtb3ZlZCAob3IgYmVmb3JlIHRoZSBmaXJzdCBvbmUgaXMgZXZlciBhZGRlZClcbi5yZWNlbnRzRW1wdHkge1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm94LXNoYWRvdzogbm9uZTtcbn1cblxuLmNoaXBXcmFwIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbGV4OiBub25lO1xuICBhbmltYXRpb246IGNoaXBJbiAwLjRzIGN1YmljLWJlemllcigwLjM0LCAxLjU2LCAwLjY0LCAxKSBib3RoO1xufVxuXG4vLyBzd2FwcyBpbiBmb3IgLmNoaXBXcmFwIHdoaWxlIGEgY2hpcCBpcyBsZWF2aW5nIChzZWUgcmVtb3ZlRmF2b3JpdGUgL1xuLy8gaGFuZGxlQ2hpcFJlbW92ZUVuZCBpbiBDb2xvcldoZWVsLnRzeCkgLS0gdHJhbnNmb3JtLW9ubHksIHNvIGl0IGtlZXBzXG4vLyBvY2N1cHlpbmcgaXRzIGZsZXggc2xvdCAoYW5kIC5yZWNlbnRzJyB3aWR0aCkgdW50aWwgaXQncyBmdWxseSBpbnZpc2libGUsXG4vLyBhdCB3aGljaCBwb2ludCB0aGUgYWN0dWFsIHJlbW92YWwgKyAucmVjZW50cycgb3duIHdpZHRoIHRyYW5zaXRpb24ga2ljayBpblxuLmNoaXBXcmFwUmVtb3Zpbmcge1xuICBhbmltYXRpb246IGNoaXBPdXQgMC4yMnMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSkgYm90aDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5jaGlwIHtcbiAgd2lkdGg6IDI2cHg7XG4gIGhlaWdodDogMjZweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMjIpLCB2YXIoLS1zaGFkb3ctc29mdCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBlYXNlLCBib3gtc2hhZG93IDAuMTVzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgdHJhbnNmb3JtOiBzY2FsZSgxLjE0KSB0cmFuc2xhdGVZKC0xcHgpO1xuICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDFweCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMyksIDAgNHB4IDEwcHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gIH1cbiAgJjphY3RpdmUge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wMik7XG4gIH1cbn1cblxuLy8gbm90aWZpY2F0aW9uLWJhZGdlIHN0eWxlOiBzaXRzIG9mZi1jZW50ZXIgb24gdGhlIGNoaXAncyByaW0sIHJldmVhbGVkIG9ubHlcbi8vIG9uIGhvdmVyIHNvIGl0IG5ldmVyIGNvbXBldGVzIHdpdGggdGhlIGNoaXAncyBvd24gY2xpY2stdG8tc2VsZWN0IGFyZWFcbi5jaGlwUmVtb3ZlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IC0zcHg7XG4gIHJpZ2h0OiAtM3B4O1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VyZmFjZSk7XG4gIGNvbG9yOiB2YXIoLS10ZXh0LWRpbSk7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMyksIGluc2V0IDAgMCAwIDFweCByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMjUpO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDI7XG4gIG9wYWNpdHk6IDA7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB0cmFuc2Zvcm06IHNjYWxlKDAuNik7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xMnMgZWFzZSwgdHJhbnNmb3JtIDAuMTJzIGVhc2UsIGNvbG9yIDAuMTJzIGVhc2U7XG5cbiAgc3ZnIHtcbiAgICB3aWR0aDogOHB4O1xuICAgIGhlaWdodDogOHB4O1xuICB9XG4gICY6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxuICAuY2hpcFdyYXA6aG92ZXIgJiB7XG4gICAgb3BhY2l0eTogMTtcbiAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICB9XG59XG5cbkBrZXlmcmFtZXMgY2hpcEluIHtcbiAgMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDApIHJvdGF0ZSgtMjVkZWcpOyBvcGFjaXR5OiAwOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpIHJvdGF0ZSgwKTsgb3BhY2l0eTogMTsgfVxufVxuXG5Aa2V5ZnJhbWVzIGNoaXBPdXQge1xuICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSkgcm90YXRlKDApOyBvcGFjaXR5OiAxOyB9XG4gIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDApIHJvdGF0ZSgxOGRlZyk7IG9wYWNpdHk6IDA7IH1cbn1cblxuLy8gPT09PT09PT09PT09IFBpY2tlcjogcG9zaXRpb25pbmcgY29udGV4dCBmb3IgdGhlIHJpbmcncyBibGVlZCA9PT09PT09PT09PT1cbi8vIEV2ZXJ5IGRpcmVjdCBjaGlsZCBiZWxvdyBpcyBwb3NpdGlvbjphYnNvbHV0ZSAodGhlcmUncyBubyBiYWNraW5nIGNhcmQgdG9cbi8vIGhvbGQgdGhlIGJveCBvcGVuKSwgc28gLnBpY2tlciBuZWVkcyBhbiBleHBsaWNpdCBzaXplIG9yIGl0IG1lYXN1cmVzIGFzXG4vLyAweDAgdG8gdGhlIGxheW91dCBlbmdpbmUgLS0gbWFyZ2luLXRvcCByZXNlcnZlcyByb29tIGZvciB3aGF0IHJlbmRlcnNcbi8vIGFib3ZlIHRoZSBzaGFyZWQgY2VudGVyIGFuY2hvciAobW9zdGx5IHRoZSBtb2RlIHRvZ2dsZSkuIGBoZWlnaHRgIGlzIHNldFxuLy8gaW5saW5lIGZyb20gQ29sb3JXaGVlbC50c3ggaW5zdGVhZCBvZiBoZXJlLCBzaW5jZSBob3cgZmFyIGRvd24gaXQgbmVlZHMgdG9cbi8vIHJlc2VydmUgZGVwZW5kcyBvbiBgYXJjVmlzaWJsZWAgKHRoZSBhbHBoYSBhcmMgcmVhY2hlcyBsb3dlciB0aGFuIHRoZSByaW5nXG4vLyBhbG9uZSBkb2VzKSAtLSBwbGFpbiBTQ1NTIGNhbid0IHNlZSB0aGF0IHByb3AuXG4ucGlja2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tdG9wOiA5NnB4O1xuICB3aWR0aDogMjcycHg7XG59XG5cbi5nbG93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMzQwcHg7XG4gIGhlaWdodDogMzQwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgdG9wOiA4OHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBvcGFjaXR5OiAwLjU1O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgei1pbmRleDogMDtcbn1cblxuLy8gPT09PT09PT09PT09IE1vZGUgdG9nZ2xlOiBzd2l0Y2hlcyB3aGF0IHRoZSByaW5nIGFkanVzdHMgKEgvUy9WKSA9PT09PT09PT09PT1cbi5tb2RlVG9nZ2xlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gMTcwcHgpKTtcbiAgei1pbmRleDogMztcbiAgZGlzcGxheTogZ3JpZDtcbiAgLy8gZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zIGFuZCB3aWR0aCBhcmUgc2V0IGlubGluZSAobW9kZSBjb3VudCBpcyBkeW5hbWljOlxuICAvLyAzLXdheSBIL1MvViBvciA0LXdheSBIL1MvVi9BIGRlcGVuZGluZyBvbiBzaG93QWxwaGFDb250cm9sKVxuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlLTIpO1xuICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgcGFkZGluZzogM3B4O1xuICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgdmFyKC0tc2hhZG93LXNvZnQpO1xufVxuXG4ubW9kZVBpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogM3B4O1xuICBib3R0b206IDNweDtcbiAgbGVmdDogM3B4O1xuICAvLyB3aWR0aCBpcyBzZXQgaW5saW5lIChzZWUgLm1vZGVUb2dnbGUpXG4gIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdXJmYWNlKTtcbiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LXNvZnQpO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMgY3ViaWMtYmV6aWVyKDAuMiwgMC44LCAwLjIsIDEpO1xufVxuXG4ubW9kZUJ1dHRvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGhlaWdodDogMjJweDtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBmb250LXNpemU6IDEwLjVweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbGluZS1oZWlnaHQ6IDIycHg7XG4gIGxldHRlci1zcGFjaW5nOiAwLjAyZW07XG4gIGNvbG9yOiB2YXIoLS10ZXh0LWRpbSk7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlO1xuXG4gICYuYWN0aXZlIHtcbiAgICBjb2xvcjogdmFyKC0tdGV4dCk7XG4gIH1cbiAgJjpob3Zlcjpub3QoLmFjdGl2ZSkge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0KTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT0gU3RhZ2U6IGEgdHJ1ZSByaW5nIChhbm51bHVzIHZpYSBtYXNrKSA9PT09PT09PT09PT1cbi5zdGFnZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtNDhweDtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjcycHg7XG4gIGhlaWdodDogMjcycHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xufVxuXG4vLyBzaGFkb3cgY2FzdGVyOiBhIHBsYWluLCB1bm1hc2tlZCBjaXJjbGUgYmVoaW5kIHRoZSByaW5nLiBib3gtc2hhZG93IGRyYXdzXG4vLyBvdXRzaWRlIGl0cyBib3JkZXItYm94IHJlZ2FyZGxlc3Mgb2YgdGhlIGhvbGUgaW4gdGhlIHNoYXBlIGRyYXduIG9uIHRvcCBvZlxuLy8gaXQsIHNvIHRoaXMgcmVsaWFibHkgY2FzdHMgYSBzaGFkb3cgYXJvdW5kIHRoZSByaW5nJ3Mgb3V0ZXIgZWRnZSAtLVxuLy8gZmlsdGVyOmRyb3Atc2hhZG93IG9uIHRoZSBtYXNrZWQgLnJpbmcgaXRzZWxmIGlzIHVucmVsaWFibGUgYWNyb3NzIGVuZ2luZXMuXG4uc3RhZ2VTaGFkb3cge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMjIpLCAwIDEwcHggMThweCByZ2JhKDAsIDAsIDAsIDAuMjIpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnJpbmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB6LWluZGV4OiAyO1xuICAvLyBiYWNrZ3JvdW5kIGlzIHNldCBwZXItbW9kZSBpbmxpbmU6IGh1ZSBzcGVjdHJ1bSAvIGdyZXktdG8tY29sb3IgLyBibGFjay10by1jb2xvclxuICAtd2Via2l0LW1hc2s6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgY2xvc2VzdC1zaWRlLCB0cmFuc3BhcmVudCAwIDkycHgsIGJsYWNrIDkzcHggMTAwJSk7XG4gIG1hc2s6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgY2xvc2VzdC1zaWRlLCB0cmFuc3BhcmVudCAwIDkycHgsIGJsYWNrIDkzcHggMTAwJSk7XG59XG5cbi8vIHJvdGF0ZWQsIG5vdCByZXBvc2l0aW9uZWQgdmlhIHRvcC9sZWZ0IC0tIHNlZSB0aGUgY29tbWVudCBvblxuLy8gcmluZ0FuZ2xlRnJvbVRvcERlZyBpbiBDb2xvcldoZWVsLnRzeCBmb3Igd2h5XG4uaHVlSGFuZGxlUGl2b3Qge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAwO1xuICBoZWlnaHQ6IDA7XG4gIC8vIGB0cmFuc2Zvcm1gIGNyZWF0ZXMgYSBuZXcgc3RhY2tpbmcgY29udGV4dCwgc28gdGhpcyBuZWVkcyBpdHMgb3duXG4gIC8vIHotaW5kZXggLS0gdGhlIGNoaWxkIC5odWVIYW5kbGUncyB6LWluZGV4IG9ubHkgcmFua3MgaXQgd2l0aGluIHRoaXNcbiAgLy8gY29udGV4dCwgbm90IGFnYWluc3QgdGhlIHJpbmcvZGlzYy9iYWRnZXMgc2l0dGluZyBvdXRzaWRlIGl0XG4gIHotaW5kZXg6IDM7XG4gIC8vIHN0cm9uZyBlYXNlLW91dCAtLSBmYXN0IHN0YXJ0LCBsb25nIGRlY2VsZXJhdGlvbiBpbnRvIHRoZSBmaW5hbCBhbmdsZSxcbiAgLy8gbGlrZSBicmFraW5nIGludG8gcG9zaXRpb24uIFJlYWRzIGFzIGEgcmVhbCBzd2VlcCBvbiBhIGJpZyBtb2RlLXN3aXRjaFxuICAvLyBqdW1wLCBzdGF5cyBzbmFwcHkgb24gc21hbGwgd2hlZWwtdGljayBudWRnZXMuXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjMycyBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTtcbn1cbi5yb290W2RhdGEtZHJhZ2dpbmc9J3RydWUnXSAuaHVlSGFuZGxlUGl2b3Qge1xuICB0cmFuc2l0aW9uOiBub25lO1xufVxuLmh1ZUhhbmRsZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtMTE0cHg7IC8vIG1pZC1iYW5kIHJhZGl1cyAoMC40MTkxICogMjcycHggc3RhZ2UpLCBmaXhlZCBkaXN0YW5jZSBmcm9tIHRoZSBwaXZvdFxuICBsZWZ0OiAwO1xuICB3aWR0aDogMjJweDtcbiAgaGVpZ2h0OiAyMnB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogM3B4IHNvbGlkICNmZmY7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuNCksIDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgY3Vyc29yOiBncmFiO1xuICB6LWluZGV4OiAzO1xufVxuXG4vLyA9PT09PT09PT09PT0gQWxwaGEgYXJjOiBhIGN1cnZlZCBhbHBoYSBzbGlkZXIgb3V0c2lkZSB0aGUgcmluZyA9PT09PT09PT09PT1cbi8vIGEgcHVyZSAxRCBjb250cm9sLCBwb3NpdGlvbiBhbG9uZyB0aGUgMTIwZGVnIGJhbmQgKGJvdHRvbS1jZW50ZXJlZCkgZmFkZXNcbi8vIGEgY2hlY2tlcmJvYXJkIChhbHBoYSAwKSBpbnRvIHRoZSBjdXJyZW50IHNvbGlkIGNvbG9yIChhbHBoYSAxKS4gY2xpcC1wYXRoXG4vLyBhbHNvIGdhdGVzIGhpdC10ZXN0aW5nLCBzbyBjbGlja3Mgb3V0c2lkZSB0aGUgdmlzaWJsZSBjcmVzY2VudCBmYWxsIHRocm91Z2guXG4kYXJjUGF0aDogcGF0aCgnTSAzMjguNTYsMjcwIEEgMTYwIDE2MCAwIDAgMSA1MS40NCwyNzAgTCA2NS4yOSwyNjIgQSAxNDQgMTQ0IDAgMCAwIDMxNC43MSwyNjIgWicpO1xuXG4vLyBzaGFkb3cgY2FzdGVyOiBjbGlwLXBhdGggKyBmaWx0ZXI6Ymx1ciBvbiB0aGUgU0FNRSBlbGVtZW50IGNsaXBzIGF3YXkgdGhlXG4vLyBibHVyJ3Mgb3duIHNvZnQgZWRnZSAobm8gcm9vbSBvdXRzaWRlIHRoZSBwYXRoIGZvciBpdCB0byBmYWRlIGludG8pLFxuLy8gbGVhdmluZyBhIGhhcmQtZWRnZWQgc211ZGdlLiBGaXg6IGJsdXIgYSB3cmFwcGVyIHRoYXQgSVNOJ1QgaXRzZWxmIGNsaXBwZWRcbi8vIC0tIGl0IGNvbXBvc2l0ZXMgaXRzIGNsaXBwZWQgY2hpbGQgZmlyc3QsIHRoZW4gYmx1cnMgdGhhdCB3aG9sZSByZXN1bHRcbi8vIGZyZWVseSwgc2luY2Ugbm90aGluZyBjbGlwcyB0aGUgd3JhcHBlciBhZnRlcndhcmQuXG4uYWxwaGFBcmNTaGFkb3dXcmFwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDM4MHB4O1xuICBoZWlnaHQ6IDM4MHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZShjYWxjKC01MCUgKyAxcHgpLCBjYWxjKC01MCUgKyA1cHgpKTtcbiAgei1pbmRleDogMTtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGZpbHRlcjogYmx1cig3cHgpO1xufVxuLmFscGhhQXJjU2hhZG93IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjIyKTtcbiAgY2xpcC1wYXRoOiAkYXJjUGF0aDtcbn1cblxuLmFscGhhQXJjIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDM4MHB4O1xuICBoZWlnaHQ6IDM4MHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgdG91Y2gtYWN0aW9uOiBub25lO1xuICBjdXJzb3I6IGdyYWI7XG4gIHotaW5kZXg6IDI7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG4gIGNsaXAtcGF0aDogJGFyY1BhdGg7XG59XG5cbi5hbHBoYUFyY0ZpbGwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGluc2V0OiAwO1xuICAvLyBjb25pYy1ncmFkaWVudCBzZXQgaW5saW5lIChuZWVkcyB0aGUgbGl2ZSBhY2NlbnQgY29sb3IpXG59XG5cbi8vIGNsaXAtcGF0aCBjYW4ndCB0YWtlIGEgYm9yZGVyLXJhZGl1cywgc28gdGhlIGJhbmQncyB0d28gZmxhdC1jdXQgZW5kcyBhcmVcbi8vIFwicm91bmRlZFwiIGJ5IGNhcHBpbmcgdGhlbSB3aXRoIHBsYWluIGNpcmNsZXMgc2l6ZWQgdG8gdGhlIGJhbmQncyBvd25cbi8vIHRoaWNrbmVzcyAtLSBhIHBpbGwgY2FwLCBzYW1lIHRyaWNrIGFzIGEgcm91bmRlZC1lbmQgc3Ryb2tlLiBUaGVzZSBzaXRcbi8vIE9VVFNJREUgLmFscGhhQXJjIChpdHMgY2xpcC1wYXRoIHdvdWxkIHNsaWNlIHRoZW0gdG9vKSwgcG9zaXRpb25lZCBmcm9tXG4vLyB0aGUgc2hhcmVkIGNlbnRlciBwb2ludCBsaWtlIHRoZSBtb2RlIHRvZ2dsZSBpcy5cbi5hbHBoYUFyY0NhcCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA4OHB4O1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxNnB4O1xuICBoZWlnaHQ6IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgei1pbmRleDogMjtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHZhcigtLXN1cmZhY2UtMik7XG59XG4uYWxwaGFBcmNDYXBTdGFydCB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKGNhbGMoLTUwJSArIDEzMS42cHgpLCBjYWxjKC01MCUgKyA3NnB4KSk7XG4gIC8vIGJhY2tncm91bmQgc2V0IGlubGluZSAoYWNjZW50LXNvbGlkLCB0aGUgXCJmdWxsXCIgZW5kKVxufVxuLmFscGhhQXJjQ2FwRW5kIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoY2FsYygtNTAlIC0gMTMxLjZweCksIGNhbGMoLTUwJSArIDc2cHgpKTtcbn1cblxuLy8gc2l0cyBPVVRTSURFIC5hbHBoYUFyYyB0b28sIHNhbWUgcmVhc29uIGFzIHRoZSBjYXBzIC0tIGNsaXAtcGF0aCB3b3VsZFxuLy8gc2xpY2UgaXQgaW50byBhIGNyZXNjZW50IHdoZW5ldmVyIGl0IG5lYXJzIHRoZSBiYW5kJ3MgZmxhdC1jdXQgZW5kc1xuLmFscGhhQXJjSGFuZGxlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDg4cHg7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE4cHg7XG4gIGhlaWdodDogMThweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBib3JkZXI6IDJweCBzb2xpZCAjZmZmO1xuICBib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjUpLCAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xuICB6LWluZGV4OiAzO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMTJzIGVhc2U7XG59XG4ucm9vdFtkYXRhLWRyYWdnaW5nPSd0cnVlJ10gLmFscGhhQXJjSGFuZGxlIHtcbiAgdHJhbnNpdGlvbjogbm9uZTtcbn1cblxuLy8gPT09PT09PT09PT09IEN1cnJlbnQtY29sb3IgZGlzYyA9PT09PT09PT09PT1cbi5jdXJyZW50RGlzYyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDE1NnB4O1xuICBoZWlnaHQ6IDE1NnB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHotaW5kZXg6IDI7XG4gIGJveC1zaGFkb3c6IDAgMTBweCAyNHB4IC04cHggcmdiYSgyMCwgMTYsIDEwLCAwLjQpLCBpbnNldCAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjA4KTtcbiAgYmFja2dyb3VuZC1pbWFnZTpcbiAgICBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHZhcigtLWNoZWNrLWEpIDI1JSwgdHJhbnNwYXJlbnQgMjUlLCB0cmFuc3BhcmVudCA3NSUsIHZhcigtLWNoZWNrLWEpIDc1JSksXG4gICAgbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB2YXIoLS1jaGVjay1hKSAyNSUsIHRyYW5zcGFyZW50IDI1JSwgdHJhbnNwYXJlbnQgNzUlLCB2YXIoLS1jaGVjay1hKSA3NSUpO1xuICBiYWNrZ3JvdW5kLXNpemU6IDEycHggMTJweDtcbiAgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAwLCA2cHggNnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jaGVjay1iKTtcbn1cblxuLmRpc2NGaWxsIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgLy8gYmFja2dyb3VuZCAocmdiYSBvZiBjdXJyZW50IGNvbG9yLCBzbyB0aGUgY2hlY2tlcmJvYXJkIHJlYWRzIHRocm91Z2hcbiAgLy8gd2hlbiBhbHBoYSA8IDEpIHNldCBpbmxpbmVcbn1cblxuLmN1cnJlbnRIZXgsXG4uY3VycmVudEhleElucHV0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBpbnNldDogMDtcbiAgei1pbmRleDogMTtcbiAgZm9udC1mYW1pbHk6ICdTRiBNb25vJywgJ0lCTSBQbGV4IE1vbm8nLCAnSmV0QnJhaW5zIE1vbm8nLCBDb25zb2xhcywgJ0xpYmVyYXRpb24gTW9ubycsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxN3B4O1xuICBmb250LXdlaWdodDogNzAwO1xuICBsZXR0ZXItc3BhY2luZzogMC4wMWVtO1xuICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICB0ZXh0LXNoYWRvdzogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG4gIC8vIGNvbG9yIHNldCBpbmxpbmUgKGNvbXB1dGVkIGZvciBjb250cmFzdCBhZ2FpbnN0IHRoZSBjdXJyZW50IGNvbG9yKVxufVxuLmN1cnJlbnRIZXgge1xuICBkaXNwbGF5OiBncmlkO1xuICBwbGFjZS1pdGVtczogY2VudGVyO1xuICBjdXJzb3I6IHRleHQ7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cyBjdWJpYy1iZXppZXIoMC4zNCwgMS41NiwgMC42NCwgMSk7XG5cbiAgJi5jb3BpZWQge1xuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wNik7XG4gIH1cbn1cbi5jdXJyZW50SGV4SW5wdXQge1xuICB6LWluZGV4OiAyO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IG5vbmU7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG5cbiAgJjo6c2VsZWN0aW9uIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMzUpO1xuICB9XG59XG5cbi8vIGJhZGdlcyByZXN0aW5nIGlubGFuZCBvbiB0aGUgZGlzYywgdG9wIChleWVkcm9wcGVyKSBhbmQgYm90dG9tIChzYXZlIHRvXG4vLyBmYXZvcml0ZXMpIC0tIGRpc2NyZWV0OiBuZWFyLWludmlzaWJsZSBmaWxsLCBhbmQgaW5zdGVhZCBvZiBhIGRyYXduLW9uXG4vLyBib3JkZXIsIGFuIGVuZ3JhdmVkIGdyb292ZSAoZGFyayBpbnNldCBsaXAgb24gdG9wLCBmYWludCBoaWdobGlnaHQgb24gdGhlXG4vLyBib3R0b20gZWRnZSkgc28gdGhleSByZWFkIGFzIGNhcnZlZCBpbnRvIHRoZSBkaXNjIHJhdGhlciB0aGFuIHN0dWNrIG9uIGl0XG4uZGlzY0JhZGdlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMzRweDtcbiAgaGVpZ2h0OiAzNHB4O1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgZGlzcGxheTogZ3JpZDtcbiAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB6LWluZGV4OiAzO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xNXMgZWFzZSwgZmlsdGVyIDAuMTVzIGVhc2U7XG5cbiAgJjpob3ZlciB7XG4gICAgZmlsdGVyOiBicmlnaHRuZXNzKDEuMTUpO1xuICB9XG4gIHN2ZyB7XG4gICAgd2lkdGg6IDE1cHg7XG4gICAgaGVpZ2h0OiAxNXB4O1xuICB9XG59XG4uZGlzY0JhZGdlVG9wIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpO1xuICAmOmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDAuOTIpO1xuICB9XG4gICYucHVsc2Uge1xuICAgIGFuaW1hdGlvbjogYmFkZ2VQdWxzZVRvcCAwLjRzIGVhc2U7XG4gIH1cbn1cbi5kaXNjQmFkZ2VCb3R0b20ge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgKyA0NnB4KSk7XG4gICY6YWN0aXZlIHtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCBjYWxjKC01MCUgKyA0NnB4KSkgc2NhbGUoMC45Mik7XG4gIH1cbn1cbkBrZXlmcmFtZXMgYmFkZ2VQdWxzZVRvcCB7XG4gIDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEpOyB9XG4gIDQwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIGNhbGMoLTUwJSAtIDQ2cHgpKSBzY2FsZSgxLjI4KTsgfVxuICAxMDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlIC0gNDZweCkpIHNjYWxlKDEpOyB9XG59XG4iXX0= */","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","// 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\n// .picker's own height -- SCSS can't react to `arcVisible`, so it's set\n// inline instead. With the arc showing, reserve down to its visible crescent\n// (this value is chosen to match the arc's clipped band + handle, empirically\n// -- see the $arcPath comment in ColorWheel.module.scss). With it hidden,\n// shrink back to the ring's own real bottom edge (.stage's `top: -48px` +\n// `height: 272px` in the same file) so a consumer measuring .picker's box\n// (hit-testing, backdrops) doesn't get dead space below the ring.\nconst PICKER_HEIGHT_WITH_ARC = 265;\nconst PICKER_HEIGHT_NO_ARC = 224;\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 // hexes currently mid-exit-animation -- still rendered (and still counted\n // toward .recents' width) until their chipOut animation finishes, at which\n // point they're actually dropped via onFavoritesChange\n const [removingHexes, setRemovingHexes] = useState<Set<string>>(new Set());\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 // don't drop it from the list yet -- just mark it as leaving, so it stays\n // mounted (and .recents stays at its current width) through the chipOut\n // animation. handleChipRemoveEnd does the actual removal once it's done.\n setRemovingHexes((prev) => new Set(prev).add(hex));\n }\n\n function handleChipRemoveEnd(hex: string) {\n setRemovingHexes((prev) => {\n if (!prev.has(hex)) return prev;\n const next = new Set(prev);\n next.delete(hex);\n return next;\n });\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 {/* Reserved whenever the favorites feature is actually wired up (there's\n an onFavoritesChange to call), not just when there's currently\n something in it -- so the ring/toggle below never shift position as\n presets are added or removed. Empty is just visually hidden\n (.recentsEmpty), the box footprint stays. A read-only preset list\n (favorites passed without onFavoritesChange, so it can never change\n at runtime) only needs the slot while it's non-empty. */}\n {(favorites.length > 0 || onFavoritesChange) && (\n <div className={[styles.recents, favorites.length === 0 ? styles.recentsEmpty : \"\"].join(\" \")}>\n {favorites.map((hex, i) => (\n // keyed by hex alone (not index) so an add/remove -- which\n // shifts every other item's index -- doesn't remount and replay\n // the entrance animation on chips that were already there; only\n // a genuinely new hex mounts fresh and animates in\n <div\n key={hex}\n className={[styles.chipWrap, removingHexes.has(hex) ? styles.chipWrapRemoving : \"\"].join(\" \")}\n style={{ animationDelay: removingHexes.has(hex) ? undefined : `${i * 0.05}s` }}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && e.animationName.includes(\"chipOut\")) handleChipRemoveEnd(hex);\n }}\n >\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} style={{ height: arcVisible ? PICKER_HEIGHT_WITH_ARC : PICKER_HEIGHT_NO_ARC }}>\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"]}