@tachui/modifiers 0.8.0-alpha → 0.8.5-alpha

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.
Files changed (197) hide show
  1. package/README.md +19 -9
  2. package/dist/animation/index.d.ts +11 -0
  3. package/dist/animation/index.d.ts.map +1 -0
  4. package/dist/appearance/background.d.ts +23 -6
  5. package/dist/appearance/background.d.ts.map +1 -1
  6. package/dist/appearance/border.d.ts +2 -2
  7. package/dist/appearance/border.d.ts.map +1 -1
  8. package/dist/appearance/clip-shape.d.ts +2 -2
  9. package/dist/appearance/clip-shape.d.ts.map +1 -1
  10. package/dist/appearance/clipped.d.ts +2 -2
  11. package/dist/appearance/clipped.d.ts.map +1 -1
  12. package/dist/appearance/foreground.d.ts +14 -5
  13. package/dist/appearance/foreground.d.ts.map +1 -1
  14. package/dist/appearance/index.js +11 -12
  15. package/dist/appearance/reactive-factories.d.ts +20 -0
  16. package/dist/appearance/reactive-factories.d.ts.map +1 -0
  17. package/dist/attributes/accessibility.d.ts +10 -0
  18. package/dist/attributes/accessibility.d.ts.map +1 -0
  19. package/dist/attributes/aria.d.ts +2 -2
  20. package/dist/attributes/aria.d.ts.map +1 -1
  21. package/dist/attributes/css-properties.d.ts +2 -2
  22. package/dist/attributes/css-properties.d.ts.map +1 -1
  23. package/dist/attributes/html.d.ts +2 -2
  24. package/dist/attributes/html.d.ts.map +1 -1
  25. package/dist/attributes/index.d.ts +1 -0
  26. package/dist/attributes/index.d.ts.map +1 -1
  27. package/dist/base.d.ts +6 -7
  28. package/dist/base.d.ts.map +1 -1
  29. package/dist/base.js +9 -840
  30. package/dist/basic/animation.d.ts +41 -0
  31. package/dist/basic/animation.d.ts.map +1 -0
  32. package/dist/basic/base.d.ts +7 -8
  33. package/dist/basic/base.d.ts.map +1 -1
  34. package/dist/basic/index.d.ts +19 -2
  35. package/dist/basic/index.d.ts.map +1 -1
  36. package/dist/basic/index.js +252 -0
  37. package/dist/basic/margin.d.ts +2 -2
  38. package/dist/basic/margin.d.ts.map +1 -1
  39. package/dist/basic/margin.js +13 -158
  40. package/dist/basic/padding.d.ts +2 -2
  41. package/dist/basic/padding.d.ts.map +1 -1
  42. package/dist/basic/padding.js +13 -153
  43. package/dist/basic/size.d.ts +2 -2
  44. package/dist/basic/size.d.ts.map +1 -1
  45. package/dist/basic/size.js +10 -76
  46. package/dist/effects/backdrop/index.d.ts +60 -0
  47. package/dist/effects/backdrop/index.d.ts.map +1 -0
  48. package/dist/effects/backdrop/index.js +118 -0
  49. package/dist/effects/effects/index.d.ts +190 -0
  50. package/dist/effects/effects/index.d.ts.map +1 -0
  51. package/dist/effects/filters/index.d.ts +297 -0
  52. package/dist/effects/filters/index.d.ts.map +1 -0
  53. package/dist/effects/filters/index.js +234 -0
  54. package/dist/effects/index.d.ts +14 -0
  55. package/dist/effects/index.d.ts.map +1 -0
  56. package/dist/effects/index.js +373 -0
  57. package/dist/effects/internal-exports.d.ts +9 -0
  58. package/dist/effects/internal-exports.d.ts.map +1 -0
  59. package/dist/effects/shadows/index.d.ts +316 -0
  60. package/dist/effects/shadows/index.d.ts.map +1 -0
  61. package/dist/effects/shadows/index.js +405 -0
  62. package/dist/effects/transforms/index.d.ts +316 -0
  63. package/dist/effects/transforms/index.d.ts.map +1 -0
  64. package/dist/effects/transforms/index.js +193 -0
  65. package/dist/elements/pseudo-elements.d.ts +2 -2
  66. package/dist/elements/pseudo-elements.d.ts.map +1 -1
  67. package/dist/essential-manifest.d.ts +5 -0
  68. package/dist/essential-manifest.d.ts.map +1 -0
  69. package/dist/index.d.ts +10 -3
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +273 -881
  72. package/dist/interaction/allows-hit-testing.d.ts +1 -1
  73. package/dist/interaction/allows-hit-testing.d.ts.map +1 -1
  74. package/dist/interaction/dom-events.d.ts +35 -0
  75. package/dist/interaction/dom-events.d.ts.map +1 -0
  76. package/dist/interaction/focus-events.d.ts +54 -0
  77. package/dist/interaction/focus-events.d.ts.map +1 -0
  78. package/dist/interaction/focusable.d.ts +1 -1
  79. package/dist/interaction/focusable.d.ts.map +1 -1
  80. package/dist/interaction/focused.d.ts +1 -1
  81. package/dist/interaction/focused.d.ts.map +1 -1
  82. package/dist/interaction/index.d.ts +5 -0
  83. package/dist/interaction/index.d.ts.map +1 -1
  84. package/dist/interaction/index.js +75 -28
  85. package/dist/interaction/keyboard-events.d.ts +69 -0
  86. package/dist/interaction/keyboard-events.d.ts.map +1 -0
  87. package/dist/interaction/keyboard-shortcut.d.ts +1 -1
  88. package/dist/interaction/keyboard-shortcut.d.ts.map +1 -1
  89. package/dist/interaction/mouse-events.d.ts +125 -0
  90. package/dist/interaction/mouse-events.d.ts.map +1 -0
  91. package/dist/interaction/on-continuous-hover.d.ts +1 -1
  92. package/dist/interaction/on-continuous-hover.d.ts.map +1 -1
  93. package/dist/interaction/on-hover.d.ts +30 -0
  94. package/dist/interaction/on-hover.d.ts.map +1 -0
  95. package/dist/interaction/on-long-press-gesture.d.ts +1 -1
  96. package/dist/interaction/on-long-press-gesture.d.ts.map +1 -1
  97. package/dist/interaction/scroll.d.ts +2 -2
  98. package/dist/interaction/scroll.d.ts.map +1 -1
  99. package/dist/layout/aspect-ratio.d.ts +2 -2
  100. package/dist/layout/aspect-ratio.d.ts.map +1 -1
  101. package/dist/layout/fixed-size.d.ts +2 -2
  102. package/dist/layout/fixed-size.d.ts.map +1 -1
  103. package/dist/layout/flexbox.d.ts +2 -2
  104. package/dist/layout/flexbox.d.ts.map +1 -1
  105. package/dist/layout/frame.d.ts +13 -0
  106. package/dist/layout/frame.d.ts.map +1 -0
  107. package/dist/layout/index.d.ts +2 -0
  108. package/dist/layout/index.d.ts.map +1 -1
  109. package/dist/layout/index.js +25 -22
  110. package/dist/layout/offset.d.ts +2 -2
  111. package/dist/layout/offset.d.ts.map +1 -1
  112. package/dist/layout/overlay.d.ts +1 -1
  113. package/dist/layout/overlay.d.ts.map +1 -1
  114. package/dist/layout/position.d.ts +2 -2
  115. package/dist/layout/position.d.ts.map +1 -1
  116. package/dist/layout/resizable.d.ts +6 -0
  117. package/dist/layout/resizable.d.ts.map +1 -0
  118. package/dist/layout/scale-effect.d.ts +6 -5
  119. package/dist/layout/scale-effect.d.ts.map +1 -1
  120. package/dist/layout/z-index.d.ts +2 -2
  121. package/dist/layout/z-index.d.ts.map +1 -1
  122. package/dist/lifecycle/index.d.ts +6 -0
  123. package/dist/lifecycle/index.d.ts.map +1 -0
  124. package/dist/modifiers-basic-DLmE749_.js +5604 -0
  125. package/dist/navigation/index.d.ts +12 -0
  126. package/dist/navigation/index.d.ts.map +1 -0
  127. package/dist/preload/backdrop.d.ts +5 -0
  128. package/dist/preload/backdrop.d.ts.map +1 -0
  129. package/dist/preload/backdrop.js +7 -0
  130. package/dist/preload/basic.d.ts +7 -0
  131. package/dist/preload/basic.d.ts.map +1 -0
  132. package/dist/preload/basic.js +251 -0
  133. package/dist/preload/effects.d.ts +6 -0
  134. package/dist/preload/effects.d.ts.map +1 -0
  135. package/dist/preload/effects.js +95 -0
  136. package/dist/preload/filters.d.ts +6 -0
  137. package/dist/preload/filters.d.ts.map +1 -0
  138. package/dist/preload/filters.js +31 -0
  139. package/dist/preload/shadows.d.ts +5 -0
  140. package/dist/preload/shadows.d.ts.map +1 -0
  141. package/dist/preload/shadows.js +27 -0
  142. package/dist/preload/transforms.d.ts +5 -0
  143. package/dist/preload/transforms.d.ts.map +1 -0
  144. package/dist/preload/transforms.js +30 -0
  145. package/dist/types.d.ts +7 -6
  146. package/dist/types.d.ts.map +1 -1
  147. package/dist/types.js +0 -1
  148. package/dist/typography/font.d.ts +5 -2
  149. package/dist/typography/font.d.ts.map +1 -1
  150. package/dist/typography/index.d.ts +1 -0
  151. package/dist/typography/index.d.ts.map +1 -1
  152. package/dist/typography/index.js +26 -28
  153. package/dist/typography/text.d.ts +2 -2
  154. package/dist/typography/text.d.ts.map +1 -1
  155. package/dist/typography/text.js +9 -127
  156. package/dist/typography/typography.d.ts +6 -4
  157. package/dist/typography/typography.d.ts.map +1 -1
  158. package/dist/utility/as-html-validator.d.ts +20 -0
  159. package/dist/utility/as-html-validator.d.ts.map +1 -0
  160. package/dist/utility/as-html.d.ts +65 -0
  161. package/dist/utility/as-html.d.ts.map +1 -0
  162. package/dist/utility/basic-sanitizer.d.ts +54 -0
  163. package/dist/utility/basic-sanitizer.d.ts.map +1 -0
  164. package/dist/utility/css.d.ts +2 -2
  165. package/dist/utility/css.d.ts.map +1 -1
  166. package/dist/utility/index.d.ts +3 -0
  167. package/dist/utility/index.d.ts.map +1 -1
  168. package/dist/utility/index.js +19 -15
  169. package/dist/utility/utility.d.ts +2 -2
  170. package/dist/utility/utility.d.ts.map +1 -1
  171. package/dist/version.d.ts +14 -0
  172. package/dist/version.d.ts.map +1 -0
  173. package/package.json +59 -4
  174. package/dist/allows-hit-testing-DscPrcOw.js +0 -464
  175. package/dist/allows-hit-testing-DscPrcOw.js.map +0 -1
  176. package/dist/appearance/index.js.map +0 -1
  177. package/dist/base-CkGf4b9G.js +0 -786
  178. package/dist/base-CkGf4b9G.js.map +0 -1
  179. package/dist/base.js.map +0 -1
  180. package/dist/basic/margin.js.map +0 -1
  181. package/dist/basic/padding.js.map +0 -1
  182. package/dist/basic/size.js.map +0 -1
  183. package/dist/clipped-CCW8gJqJ.js +0 -282
  184. package/dist/clipped-CCW8gJqJ.js.map +0 -1
  185. package/dist/css-CJEXRr6H.js +0 -124
  186. package/dist/css-CJEXRr6H.js.map +0 -1
  187. package/dist/font-3qM2Z97N.js +0 -135
  188. package/dist/font-3qM2Z97N.js.map +0 -1
  189. package/dist/index.js.map +0 -1
  190. package/dist/interaction/index.js.map +0 -1
  191. package/dist/layout/index.js.map +0 -1
  192. package/dist/overlay-DDiSLprp.js +0 -774
  193. package/dist/overlay-DDiSLprp.js.map +0 -1
  194. package/dist/types.js.map +0 -1
  195. package/dist/typography/index.js.map +0 -1
  196. package/dist/typography/text.js.map +0 -1
  197. package/dist/utility/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-CkGf4b9G.js","sources":["../src/basic/base.ts"],"sourcesContent":["/**\n * Base Modifier System Implementation\n *\n * Core modifier classes and utilities for the SwiftUI-inspired modifier system.\n */\n\nimport {\n createEffect,\n isComputed,\n isSignal,\n getThemeSignal,\n} from '@tachui/core/reactive'\nimport type { Signal } from '@tachui/core/reactive/types'\nimport type { DOMNode } from '@tachui/core/runtime/types'\nimport type {\n CSSStyleProperties,\n LifecycleModifierProps,\n Modifier,\n ModifierContext,\n ReactiveModifierProps,\n StyleComputationContext,\n} from '../types'\nimport { ModifierPriority } from '@tachui/core/modifiers/types'\nimport {\n isInfinity,\n dimensionToCSS,\n shouldExpandForInfinity,\n} from '@tachui/core/constants/layout'\n\n/**\n * Abstract base modifier class\n */\nexport abstract class BaseModifier<TProps = {}> implements Modifier<TProps> {\n abstract readonly type: string\n abstract readonly priority: number\n\n constructor(public readonly properties: TProps) {}\n\n /**\n * Apply the modifier to a DOM node\n */\n abstract apply(node: DOMNode, context: ModifierContext): DOMNode | undefined\n\n /**\n * Helper to resolve reactive properties\n */\n protected resolveReactiveProps<T extends Record<string, any>>(\n props: ReactiveModifierProps<T>,\n context: StyleComputationContext\n ): T {\n const resolved = {} as T\n\n for (const [key, value] of Object.entries(props)) {\n if (isSignal(value) || isComputed(value)) {\n // Preserve the signal/computed - let applyStyles handle reactivity\n resolved[key as keyof T] = value as T[keyof T]\n } else {\n // Static value\n resolved[key as keyof T] = value\n }\n }\n\n // Context parameter is kept for compatibility but not used in new approach\n void context\n\n return resolved\n }\n\n /**\n * Apply a single style change to an element with reactive support\n */\n protected applyStyleChange(\n element: Element,\n property: string,\n value: any\n ): void {\n if (element instanceof HTMLElement) {\n const cssProperty = this.toCSSProperty(property)\n\n // Handle reactive values (signals and computed)\n if (isSignal(value) || isComputed(value)) {\n // Create reactive effect for this style property\n createEffect(() => {\n const currentValue = value()\n const cssValue = String(currentValue)\n\n // Check if value contains !important and handle it properly\n if (cssValue.includes('!important')) {\n const actualValue = cssValue.replace(/\\s*!important\\s*$/, '').trim()\n element.style.setProperty(cssProperty, actualValue, 'important')\n } else {\n element.style.setProperty(cssProperty, cssValue)\n }\n })\n } else {\n // Handle static values\n const cssValue = String(value)\n\n // Check if value contains !important and handle it properly\n if (cssValue.includes('!important')) {\n const actualValue = cssValue.replace(/\\s*!important\\s*$/, '').trim()\n element.style.setProperty(cssProperty, actualValue, 'important')\n } else {\n element.style.setProperty(cssProperty, cssValue)\n }\n }\n }\n }\n\n /**\n * Convert camelCase property to CSS kebab-case\n */\n protected toCSSProperty(property: string): string {\n return property.replace(/([A-Z])/g, '-$1').toLowerCase()\n }\n\n /**\n * Convert value to CSS value string\n */\n protected toCSSValue(value: any): string {\n if (typeof value === 'number') {\n return `${value}px`\n }\n return String(value)\n }\n\n /**\n * Convert value to CSS value string with property-specific handling\n */\n protected toCSSValueForProperty(property: string, value: any): string {\n if (typeof value === 'number') {\n // Properties that should be unitless\n const unitlessProperties = [\n 'opacity',\n 'z-index',\n 'line-height',\n 'flex-grow',\n 'flex-shrink',\n 'order',\n 'column-count',\n 'font-weight',\n ]\n\n if (unitlessProperties.includes(property)) {\n return String(value)\n }\n\n return `${value}px`\n }\n\n // Properties that should be passed through as-is (no processing)\n const passthroughProperties = [\n 'filter', // CSS filter strings should not be processed\n 'transform', // CSS transform strings\n 'clip-path', // CSS clip-path strings\n ]\n\n if (passthroughProperties.includes(property)) {\n return String(value)\n }\n\n return String(value)\n }\n\n /**\n * Apply multiple CSS properties to an element with reactive support\n */\n protected applyStyles(element: Element, styles: CSSStyleProperties): void {\n // Check if element has a style property (for testing and real elements)\n if (element instanceof HTMLElement || (element as any).style) {\n const styleTarget =\n element instanceof HTMLElement ? element.style : (element as any).style\n\n for (const [property, value] of Object.entries(styles)) {\n if (value !== undefined) {\n const cssProperty = this.toCSSProperty(property)\n\n // Handle reactive values (signals and computed)\n if (isSignal(value) || isComputed(value)) {\n // Create reactive effect for this style property\n createEffect(() => {\n const currentValue = value()\n const cssValue = this.toCSSValueForProperty(\n cssProperty,\n currentValue\n )\n\n if (styleTarget.setProperty) {\n // Check if value contains !important and handle it properly\n if (\n typeof cssValue === 'string' &&\n cssValue.includes('!important')\n ) {\n const actualValue = cssValue\n .replace(/\\s*!important\\s*$/, '')\n .trim()\n styleTarget.setProperty(cssProperty, actualValue, 'important')\n } else {\n styleTarget.setProperty(cssProperty, cssValue)\n }\n } else {\n ;(styleTarget as any)[cssProperty] = cssValue\n }\n })\n } else {\n // Handle static values\n const cssValue = this.toCSSValueForProperty(cssProperty, value)\n\n if (styleTarget.setProperty) {\n // Check if value contains !important and handle it properly\n if (\n typeof cssValue === 'string' &&\n cssValue.includes('!important')\n ) {\n const actualValue = cssValue\n .replace(/\\s*!important\\s*$/, '')\n .trim()\n styleTarget.setProperty(cssProperty, actualValue, 'important')\n } else {\n styleTarget.setProperty(cssProperty, cssValue)\n }\n } else {\n ;(styleTarget as any)[cssProperty] = cssValue\n }\n }\n }\n }\n }\n }\n\n /**\n * Add CSS classes to an element\n */\n protected addClasses(element: Element, classes: string[]): void {\n if (element instanceof HTMLElement) {\n element.classList.add(...classes)\n }\n }\n\n /**\n * Remove CSS classes from an element\n */\n protected removeClasses(element: Element, classes: string[]): void {\n if (element instanceof HTMLElement) {\n element.classList.remove(...classes)\n }\n }\n\n /**\n * Create a style computation context\n */\n protected createStyleContext(\n componentId: string,\n element: Element,\n modifiers: Modifier[]\n ): StyleComputationContext {\n return {\n componentId,\n element,\n modifiers,\n signals: new Set(),\n cleanup: [],\n }\n }\n}\n\n/**\n * Layout modifier for frame, padding, margin\n */\nexport class LayoutModifier extends BaseModifier {\n readonly type = 'layout'\n readonly priority = ModifierPriority.LAYOUT\n\n apply(node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!node.element || !context.element) return\n\n const styleContext = this.createStyleContext(\n context.componentId,\n context.element,\n []\n )\n\n const styles = this.computeLayoutStyles(\n this.properties as any,\n styleContext\n )\n\n this.applyStyles(context.element, styles)\n\n // Handle offset separately for proper transform combining\n const props = this.properties as any\n if (props.offset && context.element instanceof HTMLElement) {\n this.applyOffsetTransform(context.element, props.offset)\n }\n\n // Handle aspectRatio separately for reactive support\n if (props.aspectRatio && context.element instanceof HTMLElement) {\n this.applyAspectRatio(context.element, props.aspectRatio)\n }\n\n // Handle scaleEffect separately for proper transform combining (Phase 3 - Epic: Butternut)\n if (props.scaleEffect && context.element instanceof HTMLElement) {\n this.applyScaleTransform(context.element, props.scaleEffect)\n }\n\n // Handle absolutePosition separately for proper positioning (Phase 3 - Epic: Butternut)\n if (props.position && context.element instanceof HTMLElement) {\n this.applyAbsolutePosition(context.element, props.position)\n }\n\n // Handle zIndex separately for proper layering (Phase 3 - Epic: Butternut)\n if (props.zIndex !== undefined && context.element instanceof HTMLElement) {\n this.applyZIndex(context.element, props.zIndex)\n }\n\n return undefined\n }\n\n private applyOffsetTransform(\n element: HTMLElement,\n offset: { x?: any; y?: any }\n ): void {\n const { x, y } = offset\n\n // Handle reactive values\n if (isSignal(x) || isComputed(x) || isSignal(y) || isComputed(y)) {\n createEffect(() => {\n const currentX = isSignal(x) || isComputed(x) ? x() : (x ?? 0)\n const currentY = isSignal(y) || isComputed(y) ? y() : (y ?? 0)\n\n const offsetX = this.toCSSValue(currentX)\n const offsetY = this.toCSSValue(currentY)\n const translateValue = `translate(${offsetX}, ${offsetY})`\n\n // Preserve existing transforms but replace any existing translate\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('translate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${translateValue}`\n : translateValue\n\n element.style.transform = newTransform\n })\n } else {\n // Handle static values\n const currentX = x ?? 0\n const currentY = y ?? 0\n\n const offsetX = this.toCSSValue(currentX)\n const offsetY = this.toCSSValue(currentY)\n const translateValue = `translate(${offsetX}, ${offsetY})`\n\n // Preserve existing transforms but replace any existing translate\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('translate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${translateValue}`\n : translateValue\n\n element.style.transform = newTransform\n }\n }\n\n private applyAspectRatio(\n element: HTMLElement,\n aspectRatio: { ratio?: any; contentMode?: 'fit' | 'fill' }\n ): void {\n const { ratio, contentMode } = aspectRatio\n\n if (ratio !== undefined) {\n // Handle reactive aspect ratio\n if (isSignal(ratio) || isComputed(ratio)) {\n createEffect(() => {\n const currentRatio = typeof ratio === 'function' ? ratio() : ratio\n element.style.aspectRatio = String(currentRatio)\n })\n } else {\n element.style.aspectRatio = String(ratio)\n }\n\n // Set content mode\n if (contentMode === 'fill') {\n element.style.objectFit = 'cover'\n } else {\n element.style.objectFit = 'contain'\n }\n }\n }\n\n // Phase 3 - Epic: Butternut Transform Methods\n\n private applyScaleTransform(\n element: HTMLElement,\n scaleEffect: { x?: any; y?: any; anchor?: string }\n ): void {\n const { x, y, anchor } = scaleEffect\n const scaleX = x ?? 1\n const scaleY = y ?? scaleX // Default to uniform scaling if y not provided\n\n // Handle reactive values\n if (\n isSignal(scaleX) ||\n isComputed(scaleX) ||\n isSignal(scaleY) ||\n isComputed(scaleY)\n ) {\n createEffect(() => {\n const currentX =\n isSignal(scaleX) || isComputed(scaleX) ? scaleX() : scaleX\n const currentY =\n isSignal(scaleY) || isComputed(scaleY) ? scaleY() : scaleY\n\n const scaleValue = `scale(${currentX}, ${currentY})`\n\n // Set transform-origin based on anchor\n element.style.transformOrigin = this.getTransformOrigin(\n anchor || 'center'\n )\n\n // Preserve existing transforms but replace any existing scale\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .replace(/\\s*scale\\([^)]*\\)\\s*/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${scaleValue}`\n : scaleValue\n\n element.style.transform = newTransform\n })\n } else {\n // Handle static values\n const scaleValue = `scale(${scaleX}, ${scaleY})`\n\n // Set transform-origin based on anchor\n element.style.transformOrigin = this.getTransformOrigin(\n anchor || 'center'\n )\n\n // Preserve existing transforms but replace any existing scale\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .replace(/\\s*scale\\([^)]*\\)\\s*/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${scaleValue}`\n : scaleValue\n\n element.style.transform = newTransform\n }\n }\n\n private applyAbsolutePosition(\n element: HTMLElement,\n position: { x?: any; y?: any }\n ): void {\n const { x, y } = position\n\n // Set position to absolute for SwiftUI-style absolute positioning\n element.style.position = 'absolute'\n\n // Handle reactive values\n if (isSignal(x) || isComputed(x) || isSignal(y) || isComputed(y)) {\n createEffect(() => {\n const currentX = isSignal(x) || isComputed(x) ? x() : (x ?? 0)\n const currentY = isSignal(y) || isComputed(y) ? y() : (y ?? 0)\n\n element.style.left = this.toCSSValue(currentX)\n element.style.top = this.toCSSValue(currentY)\n })\n } else {\n // Handle static values\n const currentX = x ?? 0\n const currentY = y ?? 0\n\n element.style.left = this.toCSSValue(currentX)\n element.style.top = this.toCSSValue(currentY)\n }\n }\n\n private applyZIndex(element: HTMLElement, zIndex: any): void {\n // Handle reactive values\n if (isSignal(zIndex) || isComputed(zIndex)) {\n createEffect(() => {\n const currentZIndex = zIndex()\n element.style.zIndex = String(currentZIndex)\n })\n } else {\n // Handle static values\n element.style.zIndex = String(zIndex)\n }\n }\n\n private getTransformOrigin(anchor: string): string {\n const anchorMap: Record<string, string> = {\n center: 'center center',\n top: 'center top',\n topLeading: 'left top',\n topTrailing: 'right top',\n bottom: 'center bottom',\n bottomLeading: 'left bottom',\n bottomTrailing: 'right bottom',\n leading: 'left center',\n trailing: 'right center',\n }\n\n return anchorMap[anchor] || 'center center'\n }\n\n private computeLayoutStyles(\n props: any,\n _context: StyleComputationContext\n ): CSSStyleProperties {\n const styles: CSSStyleProperties = {}\n\n // Frame properties - handle infinity values properly\n if (props.frame) {\n const frame = props.frame\n\n // Check for infinity constraints and apply appropriate flex/size styles\n const infinityResult = shouldExpandForInfinity(frame)\n Object.assign(styles, infinityResult.cssProps)\n\n // Convert dimensions to CSS, handling infinity appropriately\n // Don't apply explicit width/height if infinity expansion is happening\n if (frame.width !== undefined) {\n const cssValue = dimensionToCSS(frame.width)\n if (\n cssValue !== undefined &&\n !isInfinity(frame.width) &&\n !infinityResult.expandWidth\n ) {\n styles.width = cssValue\n }\n }\n\n if (frame.height !== undefined) {\n const cssValue = dimensionToCSS(frame.height)\n if (\n cssValue !== undefined &&\n !isInfinity(frame.height) &&\n !infinityResult.expandHeight\n ) {\n styles.height = cssValue\n }\n }\n\n if (frame.minWidth !== undefined) {\n const cssValue = dimensionToCSS(frame.minWidth)\n if (cssValue !== undefined) {\n styles.minWidth = cssValue\n }\n }\n\n if (frame.maxWidth !== undefined && !isInfinity(frame.maxWidth)) {\n const cssValue = dimensionToCSS(frame.maxWidth)\n if (cssValue !== undefined) {\n styles.maxWidth = cssValue\n }\n } else if (isInfinity(frame.maxWidth)) {\n // SwiftUI compatibility: maxWidth infinity means expand to fill available width\n // Remove maxWidth constraint and use flex properties for expansion\n styles.maxWidth = 'none'\n styles.flexGrow = '1 !important'\n styles.flexShrink = '1 !important'\n styles.flexBasis = '0% !important'\n styles.alignSelf = 'stretch !important'\n }\n\n if (frame.minHeight !== undefined) {\n const cssValue = dimensionToCSS(frame.minHeight)\n if (cssValue !== undefined) {\n styles.minHeight = cssValue\n }\n }\n\n if (frame.maxHeight !== undefined && !isInfinity(frame.maxHeight)) {\n const cssValue = dimensionToCSS(frame.maxHeight)\n if (cssValue !== undefined) {\n styles.maxHeight = cssValue\n }\n } else if (isInfinity(frame.maxHeight)) {\n // SwiftUI compatibility: maxHeight infinity means expand to fill available height\n // Remove maxHeight constraint and use flex properties for expansion\n styles.maxHeight = 'none'\n styles.flexGrow = '1 !important'\n styles.flexShrink = '1 !important'\n styles.flexBasis = '0% !important'\n styles.alignSelf = 'stretch !important'\n }\n }\n\n // Padding\n if (props.padding !== undefined) {\n if (typeof props.padding === 'number') {\n styles.padding = this.toCSSValue(props.padding)\n } else {\n const p = props.padding\n if (p.top !== undefined) styles.paddingTop = this.toCSSValue(p.top)\n if (p.right !== undefined)\n styles.paddingRight = this.toCSSValue(p.right)\n if (p.bottom !== undefined)\n styles.paddingBottom = this.toCSSValue(p.bottom)\n if (p.left !== undefined) styles.paddingLeft = this.toCSSValue(p.left)\n }\n }\n\n // Margin\n if (props.margin !== undefined) {\n if (typeof props.margin === 'number') {\n styles.margin = this.toCSSValue(props.margin)\n } else {\n const m = props.margin\n if (m.top !== undefined) styles.marginTop = this.toCSSValue(m.top)\n if (m.right !== undefined) styles.marginRight = this.toCSSValue(m.right)\n if (m.bottom !== undefined)\n styles.marginBottom = this.toCSSValue(m.bottom)\n if (m.left !== undefined) styles.marginLeft = this.toCSSValue(m.left)\n }\n }\n\n // Alignment\n if (props.alignment) {\n switch (props.alignment) {\n case 'leading':\n styles.textAlign = 'left'\n styles.alignItems = 'flex-start'\n break\n case 'center':\n styles.textAlign = 'center'\n styles.alignItems = 'center'\n break\n case 'trailing':\n styles.textAlign = 'right'\n styles.alignItems = 'flex-end'\n break\n case 'top':\n styles.alignItems = 'flex-start'\n break\n case 'bottom':\n styles.alignItems = 'flex-end'\n break\n }\n }\n\n // Layout Priority\n // In SwiftUI, layoutPriority determines which views get priority in sizing\n // Higher priority views determine container size in ZStack\n // We implement this using CSS flexbox properties for flexible layouts\n if (props.layoutPriority !== undefined) {\n const priority = Number(props.layoutPriority)\n\n // Set flex properties based on priority\n // Higher priority = less flex shrink, more flex grow\n if (priority > 0) {\n // High priority: Don't shrink, allow growth\n styles.flexShrink = '0'\n styles.flexGrow = String(Math.max(1, priority / 10))\n\n // For ZStack containers, higher priority elements determine size\n // We use z-index for layering and flex properties for sizing behavior\n styles.zIndex = String(priority)\n\n // In grid layouts, higher priority gets more space\n styles.gridRowEnd = `span ${String(Math.min(10, Math.max(1, Math.ceil(priority / 10))))}`\n styles.gridColumnEnd = `span ${String(Math.min(10, Math.max(1, Math.ceil(priority / 10))))}`\n } else if (priority === 0) {\n // Default priority: Normal flex behavior\n styles.flexShrink = '1'\n styles.flexGrow = '1'\n } else {\n // Low priority: Shrink more, grow less\n styles.flexShrink = String(Math.abs(priority))\n styles.flexGrow = '0'\n styles.zIndex = String(priority)\n }\n\n // For containers that need to size based on highest priority child\n // We use CSS custom properties that can be read by parent containers\n if (styles && typeof styles === 'object' && 'setProperty' in styles) {\n ;(styles as any).setProperty('--layout-priority', String(priority))\n }\n }\n\n // Offset modifier (SwiftUI .offset(x, y))\n // Note: Offset handling is done in the apply method with proper reactive support\n // This is just for setting up the basic structure\n if (props.offset) {\n // The actual transform application happens in apply() method\n // to handle both reactive and static values properly\n }\n\n // Aspect Ratio modifier (SwiftUI .aspectRatio(ratio, contentMode))\n if (props.aspectRatio) {\n const { ratio, contentMode } = props.aspectRatio\n\n if (ratio !== undefined) {\n // Apply CSS aspect-ratio property\n styles.aspectRatio = typeof ratio === 'number' ? String(ratio) : ratio\n\n // Handle content mode\n if (contentMode === 'fill') {\n styles.objectFit = 'cover'\n } else {\n styles.objectFit = 'contain'\n }\n }\n }\n\n // Fixed Size modifier (SwiftUI .fixedSize())\n if (props.fixedSize) {\n const { horizontal, vertical } = props.fixedSize\n\n if (horizontal) {\n styles.flexShrink = '0'\n styles.width = 'max-content'\n }\n if (vertical) {\n styles.flexShrink = '0'\n styles.height = 'max-content'\n }\n }\n\n return styles\n }\n}\n\n/**\n * Appearance modifier for colors, fonts, borders, shadows\n */\nexport class AppearanceModifier extends BaseModifier {\n readonly type = 'appearance'\n readonly priority = ModifierPriority.APPEARANCE\n\n apply(node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!node.element || !context.element) {\n return\n }\n\n const styleContext = this.createStyleContext(\n context.componentId,\n context.element,\n []\n )\n\n const resolved = this.resolveReactiveProps(\n this.properties as any,\n styleContext\n )\n\n // Handle Assets separately with theme reactivity\n this.applyAssetBasedStyles(context.element, resolved)\n\n // Handle non-Asset styles normally\n const styles = this.computeAppearanceStyles(resolved)\n this.applyStyles(context.element, styles)\n\n return undefined\n }\n\n /**\n * Apply Asset-based styles with theme reactivity\n */\n private applyAssetBasedStyles(element: Element, props: any): void {\n // Get the shared theme signal\n const themeSignal = getThemeSignal()\n\n // Handle foregroundColor Asset\n if (props.foregroundColor && this.isAsset(props.foregroundColor)) {\n createEffect(() => {\n // Watch theme changes to trigger re-resolution\n themeSignal()\n // Re-resolve Asset when theme changes\n const resolvedColor = props.foregroundColor.resolve()\n this.applyStyleChange(element, 'color', resolvedColor)\n })\n }\n\n // Handle backgroundColor Asset\n if (props.backgroundColor && this.isAsset(props.backgroundColor)) {\n createEffect(() => {\n // Watch theme changes to trigger re-resolution\n themeSignal()\n // Re-resolve Asset when theme changes\n const resolvedColor = props.backgroundColor.resolve()\n this.applyStyleChange(element, 'backgroundColor', resolvedColor)\n })\n }\n\n // Handle border color Asset\n if (props.border?.color && this.isAsset(props.border.color)) {\n createEffect(() => {\n // Watch theme changes\n themeSignal()\n // Re-resolve Asset when theme changes\n const resolvedColor = props.border.color.resolve()\n this.applyStyleChange(element, 'borderColor', resolvedColor)\n })\n }\n }\n\n /**\n * Check if a value is an Asset object (including Asset proxies)\n */\n private isAsset(value: any): boolean {\n return (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n 'resolve' in value &&\n typeof value.resolve === 'function'\n )\n }\n\n private computeAppearanceStyles(props: any): CSSStyleProperties {\n const styles: CSSStyleProperties = {}\n\n // Colors (skip Assets - they're handled reactively in applyAssetBasedStyles)\n if (props.foregroundColor && !this.isAsset(props.foregroundColor)) {\n styles.color = props.foregroundColor\n }\n if (props.backgroundColor && !this.isAsset(props.backgroundColor)) {\n styles.backgroundColor = props.backgroundColor\n }\n if (props.opacity !== undefined) styles.opacity = props.opacity\n\n // Font\n if (props.font) {\n const font = props.font\n if (font.family) {\n // Handle FontAsset objects that need to be resolved\n if (\n typeof font.family === 'object' &&\n font.family !== null &&\n 'resolve' in font.family\n ) {\n styles.fontFamily = (font.family as any).resolve()\n } else {\n styles.fontFamily = font.family as string\n }\n }\n if (font.size) styles.fontSize = this.toCSSValue(font.size)\n if (font.weight) styles.fontWeight = String(font.weight)\n if (font.style) styles.fontStyle = font.style\n }\n\n // Corner radius\n if (props.cornerRadius !== undefined) {\n styles.borderRadius = this.toCSSValue(props.cornerRadius)\n }\n\n // Border\n if (props.border) {\n const border = props.border\n if (border.width !== undefined)\n styles.borderWidth = this.toCSSValue(border.width)\n if (border.color && !this.isAsset(border.color)) {\n styles.borderColor = border.color as string\n }\n if (border.style) styles.borderStyle = border.style\n }\n\n // Shadow\n if (props.shadow) {\n const shadow = props.shadow\n const x = shadow.x || 0\n const y = shadow.y || 0\n const radius = shadow.radius || 0\n const color = shadow.color || 'rgba(0,0,0,0.25)'\n styles.boxShadow = `${x}px ${y}px ${radius}px ${color}`\n }\n\n // Clipped modifier (SwiftUI .clipped())\n if (props.clipped) {\n styles.overflow = 'hidden'\n }\n\n // Clip Shape modifier (SwiftUI .clipShape())\n if (props.clipShape) {\n const { shape, parameters } = props.clipShape\n\n switch (shape) {\n case 'circle':\n styles.clipPath = 'circle(50%)'\n break\n case 'ellipse': {\n const radiusX = parameters?.radiusX || '50%'\n const radiusY = parameters?.radiusY || '50%'\n styles.clipPath = `ellipse(${radiusX} ${radiusY} at center)`\n break\n }\n case 'rect': {\n const inset = parameters?.inset || 0\n styles.clipPath = `inset(${inset}px)`\n break\n }\n case 'polygon': {\n const points =\n parameters?.points || '0% 0%, 100% 0%, 100% 100%, 0% 100%'\n styles.clipPath = `polygon(${points})`\n break\n }\n }\n }\n\n // Visual Effects (Phase 2 - Epic: Butternut)\n const filters: string[] = []\n\n if (props.blur !== undefined) {\n filters.push(`blur(${props.blur}px)`)\n }\n if (props.brightness !== undefined) {\n filters.push(`brightness(${props.brightness})`)\n }\n if (props.contrast !== undefined) {\n filters.push(`contrast(${props.contrast})`)\n }\n if (props.saturation !== undefined) {\n filters.push(`saturate(${props.saturation})`)\n }\n if (props.hueRotation !== undefined) {\n filters.push(`hue-rotate(${props.hueRotation}deg)`)\n }\n if (props.grayscale !== undefined) {\n filters.push(`grayscale(${props.grayscale})`)\n }\n if (props.colorInvert !== undefined) {\n filters.push(`invert(${props.colorInvert})`)\n }\n\n if (filters.length > 0) {\n styles.filter = filters.join(' ')\n }\n\n return styles\n }\n}\n\n/**\n * Interaction modifier for events and accessibility\n */\nexport class InteractionModifier extends BaseModifier {\n readonly type = 'interaction'\n readonly priority = ModifierPriority.INTERACTION\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const props = this.properties as any\n\n // Event handlers\n if (props.onTap) {\n context.element.addEventListener('click', props.onTap)\n }\n\n if (props.onHover) {\n context.element.addEventListener('mouseenter', () => props.onHover(true))\n context.element.addEventListener('mouseleave', () => props.onHover(false))\n }\n\n if (props.onMouseEnter) {\n context.element.addEventListener('mouseenter', props.onMouseEnter)\n }\n\n if (props.onMouseLeave) {\n context.element.addEventListener('mouseleave', props.onMouseLeave)\n }\n\n if (props.onMouseDown) {\n context.element.addEventListener('mousedown', props.onMouseDown)\n }\n\n if (props.onMouseUp) {\n context.element.addEventListener('mouseup', props.onMouseUp)\n }\n\n if (props.onDragStart) {\n context.element.addEventListener('dragstart', props.onDragStart)\n }\n\n if (props.onDragOver) {\n context.element.addEventListener('dragover', props.onDragOver)\n }\n\n if (props.onDragLeave) {\n context.element.addEventListener('dragleave', props.onDragLeave)\n }\n\n if (props.onDrop) {\n context.element.addEventListener('drop', props.onDrop)\n }\n\n // Additional mouse events\n if (props.onDoubleClick) {\n context.element.addEventListener('dblclick', props.onDoubleClick)\n }\n\n if (props.onContextMenu) {\n context.element.addEventListener('contextmenu', props.onContextMenu)\n }\n\n // Focus events\n if (props.onFocus) {\n context.element.addEventListener('focus', () => props.onFocus(true))\n context.element.addEventListener('blur', () => props.onFocus(false))\n }\n\n if (props.onBlur) {\n context.element.addEventListener('blur', () => props.onBlur(false))\n }\n\n // Keyboard events\n if (props.onKeyPress) {\n context.element.addEventListener('keypress', props.onKeyPress)\n }\n\n if (props.onKeyDown) {\n context.element.addEventListener('keydown', props.onKeyDown)\n }\n\n if (props.onKeyUp) {\n context.element.addEventListener('keyup', props.onKeyUp)\n }\n\n // Scroll and wheel events\n if (props.onScroll) {\n context.element.addEventListener('scroll', props.onScroll, {\n passive: true,\n })\n }\n\n if (props.onWheel) {\n context.element.addEventListener('wheel', props.onWheel, {\n passive: false,\n })\n }\n\n // Input events\n if (props.onInput) {\n context.element.addEventListener('input', props.onInput)\n }\n\n if (props.onChange) {\n context.element.addEventListener('change', event => {\n const target = event.target as HTMLInputElement\n const value = target.value || target.textContent || ''\n props.onChange(value, event)\n })\n }\n\n // Clipboard events\n if (props.onCopy) {\n context.element.addEventListener('copy', props.onCopy)\n }\n\n if (props.onCut) {\n context.element.addEventListener('cut', props.onCut)\n }\n\n if (props.onPaste) {\n context.element.addEventListener('paste', props.onPaste)\n }\n\n // Selection events\n if (props.onSelect) {\n context.element.addEventListener('select', props.onSelect)\n }\n\n // Disabled state\n if (props.disabled !== undefined) {\n if (context.element instanceof HTMLElement) {\n if (props.disabled) {\n context.element.setAttribute('disabled', 'true')\n context.element.style.pointerEvents = 'none'\n context.element.style.opacity = '0.6'\n } else {\n context.element.removeAttribute('disabled')\n context.element.style.pointerEvents = ''\n context.element.style.opacity = ''\n }\n }\n }\n\n // Draggable state\n if (props.draggable !== undefined) {\n if (context.element instanceof HTMLElement) {\n context.element.draggable = props.draggable\n }\n }\n\n // Accessibility\n if (props.accessibilityLabel) {\n context.element.setAttribute('aria-label', props.accessibilityLabel)\n }\n\n if (props.accessibilityHint) {\n context.element.setAttribute('aria-describedby', props.accessibilityHint)\n }\n\n // Advanced Gesture Modifiers (Phase 4 - Epic: Butternut)\n if (props.onLongPressGesture) {\n this.setupLongPressGesture(context.element, props.onLongPressGesture)\n }\n\n if (props.keyboardShortcut) {\n this.setupKeyboardShortcut(context.element, props.keyboardShortcut)\n }\n\n if (props.focused !== undefined) {\n this.setupFocusManagement(context.element, props.focused)\n }\n\n if (props.focusable) {\n this.setupFocusable(context.element, props.focusable)\n }\n\n if (props.onContinuousHover) {\n this.setupContinuousHover(context.element, props.onContinuousHover)\n }\n\n if (props.allowsHitTesting !== undefined) {\n this.setupHitTesting(context.element, props.allowsHitTesting)\n }\n\n return undefined\n }\n\n // Phase 4 Advanced Gesture Methods\n\n /**\n * Setup long press gesture with timing and distance constraints\n */\n private setupLongPressGesture(\n element: Element,\n options: {\n minimumDuration?: number\n maximumDistance?: number\n perform: () => void\n onPressingChanged?: (isPressing: boolean) => void\n }\n ): void {\n const minimumDuration = options.minimumDuration ?? 500 // ms\n const maximumDistance = options.maximumDistance ?? 10 // px\n\n let timeoutId: number | undefined\n let startPoint: { x: number; y: number } | null = null\n let isPressing = false\n\n const cleanup = () => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = undefined\n }\n if (isPressing && options.onPressingChanged) {\n options.onPressingChanged(false)\n }\n isPressing = false\n startPoint = null\n }\n\n const handlePointerDown = (event: Event) => {\n const pointerEvent = event as PointerEvent\n startPoint = { x: pointerEvent.clientX, y: pointerEvent.clientY }\n isPressing = true\n\n if (options.onPressingChanged) {\n options.onPressingChanged(true)\n }\n\n timeoutId = window.setTimeout(() => {\n if (isPressing && startPoint) {\n options.perform()\n cleanup()\n }\n }, minimumDuration)\n }\n\n const handlePointerMove = (event: Event) => {\n const pointerEvent = event as PointerEvent\n if (!startPoint || !isPressing) return\n\n const distance = Math.sqrt(\n Math.pow(pointerEvent.clientX - startPoint.x, 2) +\n Math.pow(pointerEvent.clientY - startPoint.y, 2)\n )\n\n if (distance > maximumDistance) {\n cleanup()\n }\n }\n\n const handlePointerUp = () => {\n cleanup()\n }\n\n const handlePointerCancel = () => {\n cleanup()\n }\n\n // Use pointer events for better touch/mouse compatibility\n element.addEventListener('pointerdown', handlePointerDown as EventListener)\n element.addEventListener('pointermove', handlePointerMove as EventListener)\n element.addEventListener('pointerup', handlePointerUp as EventListener)\n element.addEventListener(\n 'pointercancel',\n handlePointerCancel as EventListener\n )\n\n // Store cleanup function for later removal\n ;(element as any)._longPressCleanup = cleanup\n }\n\n /**\n * Setup keyboard shortcut handling\n */\n private setupKeyboardShortcut(\n element: Element,\n shortcut: {\n key: string\n modifiers?: ('cmd' | 'ctrl' | 'shift' | 'alt' | 'meta')[]\n action: () => void\n }\n ): void {\n const modifiers = shortcut.modifiers ?? []\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Check if all required modifiers are pressed\n const requiredModifiers = {\n cmd: modifiers.includes('cmd') || modifiers.includes('meta'),\n ctrl: modifiers.includes('ctrl'),\n shift: modifiers.includes('shift'),\n alt: modifiers.includes('alt'),\n }\n\n const actualModifiers = {\n cmd: event.metaKey || event.ctrlKey, // Handle both Mac (meta) and PC (ctrl)\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n }\n\n // Check key match (case insensitive)\n const keyMatches = event.key.toLowerCase() === shortcut.key.toLowerCase()\n\n // Check modifier requirements\n const modifiersMatch = Object.entries(requiredModifiers).every(\n ([mod, required]) =>\n required === actualModifiers[mod as keyof typeof actualModifiers]\n )\n\n if (keyMatches && modifiersMatch) {\n event.preventDefault()\n shortcut.action()\n }\n }\n\n // Add keyboard event listener to document for global shortcuts\n document.addEventListener('keydown', handleKeyDown)\n\n // Store cleanup function\n ;(element as any)._keyboardShortcutCleanup = () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }\n\n /**\n * Setup focus management with reactive binding\n */\n private setupFocusManagement(\n element: Element,\n focused: boolean | Signal<boolean>\n ): void {\n if (!(element instanceof HTMLElement)) return\n\n const htmlElement = element as HTMLElement\n\n // Make element focusable if it's not naturally focusable\n if (!htmlElement.hasAttribute('tabindex')) {\n htmlElement.setAttribute('tabindex', '0')\n }\n\n if (isSignal(focused) || isComputed(focused)) {\n // Reactive focus management\n createEffect(() => {\n const shouldFocus = focused()\n if (shouldFocus) {\n htmlElement.focus()\n } else {\n htmlElement.blur()\n }\n })\n } else {\n // Static focus management\n if (focused) {\n htmlElement.focus()\n }\n }\n }\n\n /**\n * Setup focusable behavior\n */\n private setupFocusable(\n element: Element,\n options: {\n isFocusable?: boolean\n interactions?: ('activate' | 'edit')[]\n }\n ): void {\n if (!(element instanceof HTMLElement)) return\n\n const htmlElement = element as HTMLElement\n\n if (options.isFocusable === false) {\n htmlElement.setAttribute('tabindex', '-1')\n } else {\n if (!htmlElement.hasAttribute('tabindex')) {\n htmlElement.setAttribute('tabindex', '0')\n }\n }\n\n // Setup interaction behaviors\n if (options.interactions?.includes('activate')) {\n htmlElement.addEventListener('keydown', event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n htmlElement.click()\n }\n })\n }\n\n if (options.interactions?.includes('edit')) {\n htmlElement.setAttribute('role', 'textbox')\n htmlElement.setAttribute('contenteditable', 'true')\n }\n }\n\n /**\n * Setup continuous hover tracking with coordinates\n */\n private setupContinuousHover(\n element: Element,\n options: {\n coordinateSpace?: 'local' | 'global'\n perform: (location: { x: number; y: number } | null) => void\n }\n ): void {\n const coordinateSpace = options.coordinateSpace ?? 'local'\n\n const handleMouseMove = (event: Event) => {\n const mouseEvent = event as MouseEvent\n let x: number, y: number\n\n if (coordinateSpace === 'local') {\n const rect = element.getBoundingClientRect()\n x = mouseEvent.clientX - rect.left\n y = mouseEvent.clientY - rect.top\n } else {\n x = mouseEvent.clientX\n y = mouseEvent.clientY\n }\n\n options.perform({ x, y })\n }\n\n const handleMouseLeave = () => {\n options.perform(null)\n }\n\n element.addEventListener('mousemove', handleMouseMove as EventListener)\n element.addEventListener('mouseleave', handleMouseLeave as EventListener)\n\n // Store cleanup\n ;(element as any)._continuousHoverCleanup = () => {\n element.removeEventListener('mousemove', handleMouseMove as EventListener)\n element.removeEventListener(\n 'mouseleave',\n handleMouseLeave as EventListener\n )\n }\n }\n\n /**\n * Setup hit testing control\n */\n private setupHitTesting(element: Element, enabled: boolean): void {\n if (element instanceof HTMLElement) {\n element.style.pointerEvents = enabled ? '' : 'none'\n }\n }\n}\n\n/**\n * Animation modifier for transitions and animations\n */\nexport class AnimationModifier extends BaseModifier {\n readonly type = 'animation'\n readonly priority = ModifierPriority.ANIMATION\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const props = this.properties as any\n\n // Transition\n if (props.transition) {\n const t = props.transition\n const property = t.property || 'all'\n const duration = t.duration || 300\n const easing = t.easing || 'ease'\n const delay = t.delay || 0\n\n if (context.element instanceof HTMLElement) {\n context.element.style.transition = `${property} ${duration}ms ${easing} ${delay}ms`\n }\n }\n\n // Animation\n if (props.animation && context.element instanceof HTMLElement) {\n const anim = props.animation\n\n if (anim.keyframes) {\n // Create keyframes\n const keyframeName = `tachui-animation-${context.componentId}-${Date.now()}`\n const keyframeRule = this.createKeyframeRule(\n keyframeName,\n anim.keyframes\n )\n\n // Add keyframes to stylesheet\n this.addKeyframesToStylesheet(keyframeRule)\n\n // Apply animation\n const duration = anim.duration || 1000\n const easing = anim.easing || 'ease'\n const iterations = anim.iterations || 1\n const direction = anim.direction || 'normal'\n\n context.element.style.animation = `${keyframeName} ${duration}ms ${easing} ${iterations} ${direction}`\n }\n }\n\n // Transform\n if (props.transform && context.element instanceof HTMLElement) {\n if (isSignal(props.transform) || isComputed(props.transform)) {\n // Create reactive effect for transform\n createEffect(() => {\n const transformValue = props.transform()\n if (context.element instanceof HTMLElement) {\n context.element.style.transform = transformValue\n }\n })\n } else {\n context.element.style.transform = props.transform\n }\n }\n\n // Rotation Effect (SwiftUI .rotationEffect(angle))\n if (props.rotationEffect && context.element instanceof HTMLElement) {\n const { angle, anchor } = props.rotationEffect\n\n // Convert anchor to CSS transform-origin\n const anchorOrigins: Record<string, string> = {\n center: '50% 50%',\n top: '50% 0%',\n topLeading: '0% 0%',\n topTrailing: '100% 0%',\n bottom: '50% 100%',\n bottomLeading: '0% 100%',\n bottomTrailing: '100% 100%',\n leading: '0% 50%',\n trailing: '100% 50%',\n }\n\n const transformOrigin = anchorOrigins[anchor || 'center'] || '50% 50%'\n\n // Create rotation transform\n const rotationTransform = `rotate(${angle}deg)`\n\n if (isSignal(angle) || isComputed(angle)) {\n // Reactive rotation\n createEffect(() => {\n const currentAngle = typeof angle === 'function' ? angle() : angle\n const currentRotation = `rotate(${currentAngle}deg)`\n\n if (context.element instanceof HTMLElement) {\n context.element.style.transformOrigin = transformOrigin\n\n // Combine with existing transforms if any\n const existingTransform = context.element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('rotate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${currentRotation}`\n : currentRotation\n\n context.element.style.transform = newTransform\n }\n })\n } else {\n // Static rotation\n if (context.element instanceof HTMLElement) {\n context.element.style.transformOrigin = transformOrigin\n\n // Combine with existing transforms if any\n const existingTransform = context.element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('rotate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${rotationTransform}`\n : rotationTransform\n\n context.element.style.transform = newTransform\n }\n }\n }\n\n // Overlay modifier (SwiftUI .overlay())\n if (props.overlay && context.element instanceof HTMLElement) {\n this.applyOverlay(context.element, props.overlay, context)\n }\n\n return undefined\n }\n\n private applyOverlay(\n element: HTMLElement,\n overlay: { content: any; alignment?: string },\n _context: ModifierContext\n ): void {\n const { content, alignment = 'center' } = overlay\n\n // Make the element a positioned container\n if (element.style.position === '' || element.style.position === 'static') {\n element.style.position = 'relative'\n }\n\n // Create overlay container\n const overlayContainer = document.createElement('div')\n overlayContainer.style.position = 'absolute'\n overlayContainer.style.pointerEvents = 'none' // Allow clicks to pass through by default\n\n // Apply alignment positioning\n const alignmentStyles = this.getOverlayAlignment(alignment)\n Object.assign(overlayContainer.style, alignmentStyles)\n\n // Render content\n if (typeof content === 'function') {\n // If content is a function, call it to get component\n const contentComponent = content()\n if (contentComponent && typeof contentComponent.render === 'function') {\n const contentNode = contentComponent.render()\n if (contentNode.element) {\n overlayContainer.appendChild(contentNode.element)\n }\n }\n } else if (content && typeof content.render === 'function') {\n // If content is a component instance\n const contentNode = content.render()\n if (contentNode.element) {\n overlayContainer.appendChild(contentNode.element)\n }\n } else if (content instanceof HTMLElement) {\n // If content is already a DOM element\n overlayContainer.appendChild(content)\n }\n\n // Add overlay to the element\n element.appendChild(overlayContainer)\n }\n\n private getOverlayAlignment(alignment: string): Record<string, string> {\n const alignments: Record<string, Record<string, string>> = {\n center: {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n },\n top: {\n top: '0',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n bottom: {\n bottom: '0',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n leading: {\n top: '50%',\n left: '0',\n transform: 'translateY(-50%)',\n },\n trailing: {\n top: '50%',\n right: '0',\n transform: 'translateY(-50%)',\n },\n topLeading: {\n top: '0',\n left: '0',\n },\n topTrailing: {\n top: '0',\n right: '0',\n },\n bottomLeading: {\n bottom: '0',\n left: '0',\n },\n bottomTrailing: {\n bottom: '0',\n right: '0',\n },\n }\n\n return alignments[alignment] || alignments.center\n }\n\n private createKeyframeRule(\n name: string,\n keyframes: Record<string, Record<string, string>>\n ): string {\n let rule = `@keyframes ${name} {\\n`\n\n for (const [percentage, styles] of Object.entries(keyframes)) {\n rule += ` ${percentage} {\\n`\n for (const [property, value] of Object.entries(styles)) {\n const cssProperty = this.toCSSProperty(property)\n rule += ` ${cssProperty}: ${value};\\n`\n }\n rule += ` }\\n`\n }\n\n rule += '}'\n return rule\n }\n\n private addKeyframesToStylesheet(rule: string): void {\n let stylesheet = document.querySelector(\n '#tachui-animations'\n ) as HTMLStyleElement\n\n if (!stylesheet) {\n stylesheet = document.createElement('style')\n stylesheet.id = 'tachui-animations'\n document.head.appendChild(stylesheet)\n }\n\n stylesheet.appendChild(document.createTextNode(rule))\n }\n}\n\n/**\n * Lifecycle modifier for component lifecycle events\n */\nexport class LifecycleModifier extends BaseModifier {\n readonly type = 'lifecycle'\n readonly priority = ModifierPriority.CUSTOM\n\n private activeAbortController?: AbortController\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const props = this.properties as LifecycleModifierProps\n\n // Clean up any existing tasks on re-application\n if (this.activeAbortController) {\n this.activeAbortController.abort()\n }\n\n // Set up intersection observer for onAppear/onDisappear\n if (props.onAppear || props.onDisappear) {\n this.setupLifecycleObserver(context.element, props)\n }\n\n // Set up async task with cancellation\n if (props.task) {\n this.setupTask(context, props.task)\n }\n\n // Set up refreshable behavior\n if (props.refreshable) {\n this.setupRefreshable(context.element, props.refreshable)\n }\n\n return undefined\n }\n\n private setupLifecycleObserver(\n element: Element,\n props: LifecycleModifierProps\n ): void {\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting && props.onAppear) {\n // Element has appeared in viewport\n props.onAppear()\n } else if (!entry.isIntersecting && props.onDisappear) {\n // Element has disappeared from viewport\n props.onDisappear()\n }\n })\n },\n {\n threshold: 0.1, // Trigger when 10% of element is visible\n rootMargin: '10px', // Add some margin for better UX\n }\n )\n\n observer.observe(element)\n\n // Store cleanup function\n this.addCleanup(() => {\n observer.disconnect()\n })\n }\n\n private setupTask(\n _context: ModifierContext,\n task: LifecycleModifierProps['task']\n ): void {\n if (!task) return\n\n // Create abort controller for task cancellation\n this.activeAbortController = new AbortController()\n const { signal } = this.activeAbortController\n\n // Execute the task operation\n const executeTask = async () => {\n try {\n if (signal.aborted) return\n\n const result = task.operation()\n\n // Handle both sync and async operations\n if (result instanceof Promise) {\n await result\n }\n } catch (error) {\n if (signal.aborted) return\n console.error('TachUI Task Error:', error)\n }\n }\n\n // Start task execution\n executeTask()\n\n // Add cleanup to cancel task on component unmount\n this.addCleanup(() => {\n if (this.activeAbortController) {\n this.activeAbortController.abort()\n }\n })\n }\n\n private setupRefreshable(\n element: Element,\n refreshable: LifecycleModifierProps['refreshable']\n ): void {\n if (!refreshable) return\n\n let isRefreshing = false\n let pullDistance = 0\n let startY = 0\n\n const threshold = 70 // Pull threshold in pixels\n\n // Create refresh indicator element\n const refreshIndicator = document.createElement('div')\n refreshIndicator.style.cssText = `\n position: absolute;\n top: -50px;\n left: 50%;\n transform: translateX(-50%);\n width: 30px;\n height: 30px;\n border: 2px solid #ccc;\n border-top: 2px solid #007AFF;\n border-radius: 50%;\n animation: tachui-spin 1s linear infinite;\n opacity: 0;\n transition: opacity 0.3s ease;\n z-index: 1000;\n `\n\n // Add spinner animation\n if (!document.querySelector('#tachui-refresh-styles')) {\n const style = document.createElement('style')\n style.id = 'tachui-refresh-styles'\n style.textContent = `\n @keyframes tachui-spin {\n 0% { transform: translateX(-50%) rotate(0deg); }\n 100% { transform: translateX(-50%) rotate(360deg); }\n }\n `\n document.head.appendChild(style)\n }\n\n const container = element.parentElement || element\n if (container instanceof HTMLElement) {\n container.style.position = 'relative'\n container.appendChild(refreshIndicator)\n }\n\n // Touch event handlers\n const handleTouchStart = (e: TouchEvent) => {\n if (isRefreshing) return\n startY = e.touches[0].clientY\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n if (isRefreshing) return\n\n const currentY = e.touches[0].clientY\n pullDistance = Math.max(0, currentY - startY)\n\n if (pullDistance > 20) {\n e.preventDefault() // Prevent default scrolling\n\n const progress = Math.min(pullDistance / threshold, 1)\n refreshIndicator.style.opacity = String(progress * 0.8)\n refreshIndicator.style.top = `${-50 + progress * 20}px`\n }\n }\n\n const handleTouchEnd = async () => {\n if (isRefreshing || pullDistance < threshold) {\n // Reset if threshold not met\n refreshIndicator.style.opacity = '0'\n refreshIndicator.style.top = '-50px'\n pullDistance = 0\n return\n }\n\n // Trigger refresh\n isRefreshing = true\n refreshIndicator.style.opacity = '1'\n refreshIndicator.style.top = '10px'\n\n try {\n await refreshable.onRefresh()\n } catch (error) {\n console.error('TachUI Refresh Error:', error)\n } finally {\n isRefreshing = false\n refreshIndicator.style.opacity = '0'\n refreshIndicator.style.top = '-50px'\n pullDistance = 0\n }\n }\n\n // Add event listeners with proper typing\n element.addEventListener('touchstart', handleTouchStart as EventListener, {\n passive: false,\n })\n element.addEventListener('touchmove', handleTouchMove as EventListener, {\n passive: false,\n })\n element.addEventListener('touchend', handleTouchEnd as EventListener)\n\n // Cleanup\n this.addCleanup(() => {\n element.removeEventListener(\n 'touchstart',\n handleTouchStart as EventListener\n )\n element.removeEventListener('touchmove', handleTouchMove as EventListener)\n element.removeEventListener('touchend', handleTouchEnd as EventListener)\n\n if (refreshIndicator.parentElement) {\n refreshIndicator.parentElement.removeChild(refreshIndicator)\n }\n })\n }\n\n private addCleanup(cleanup: () => void): void {\n // Store cleanup functions for proper disposal\n if (!(this.properties as any)._cleanupFunctions) {\n ;(this.properties as any)._cleanupFunctions = []\n }\n ;(this.properties as any)._cleanupFunctions.push(cleanup)\n }\n}\n"],"names":["BaseModifier","properties","props","context","resolved","key","value","isSignal","isComputed","element","property","cssProperty","createEffect","currentValue","cssValue","actualValue","styles","styleTarget","classes","componentId","modifiers","LayoutModifier","__publicField","ModifierPriority","node","styleContext","offset","x","y","currentX","currentY","offsetX","offsetY","translateValue","existingTransforms","t","newTransform","aspectRatio","ratio","contentMode","currentRatio","scaleEffect","anchor","scaleX","scaleY","scaleValue","position","zIndex","currentZIndex","_context","frame","infinityResult","shouldExpandForInfinity","dimensionToCSS","isInfinity","p","m","priority","horizontal","vertical","AppearanceModifier","themeSignal","getThemeSignal","resolvedColor","font","border","shadow","radius","color","shape","parameters","radiusX","radiusY","inset","points","filters","InteractionModifier","_node","event","target","options","minimumDuration","maximumDistance","timeoutId","startPoint","isPressing","cleanup","handlePointerDown","pointerEvent","handlePointerMove","handlePointerUp","handlePointerCancel","shortcut","handleKeyDown","requiredModifiers","actualModifiers","keyMatches","modifiersMatch","mod","required","focused","htmlElement","coordinateSpace","handleMouseMove","mouseEvent","rect","handleMouseLeave","enabled","AnimationModifier","duration","easing","delay","anim","keyframeName","keyframeRule","iterations","direction","transformValue","angle","transformOrigin","rotationTransform","currentRotation","overlay","content","alignment","overlayContainer","alignmentStyles","contentComponent","contentNode","alignments","name","keyframes","rule","percentage","stylesheet","LifecycleModifier","observer","entries","entry","task","signal","result","error","refreshable","isRefreshing","pullDistance","startY","threshold","refreshIndicator","style","container","handleTouchStart","e","handleTouchMove","progress","handleTouchEnd"],"mappings":"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"}
package/dist/base.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sources":["../src/base.ts"],"sourcesContent":["/**\n * Base Modifier System Implementation\n *\n * Core modifier classes and utilities for the SwiftUI-inspired modifier system.\n */\n\nimport {\n createEffect,\n isComputed,\n isSignal,\n getThemeSignal,\n} from '@tachui/core/reactive'\nimport type { Signal } from '@tachui/core/reactive/types'\nimport type { DOMNode } from '@tachui/core/runtime/types'\nimport type {\n CSSStyleProperties,\n LifecycleModifierProps,\n Modifier,\n ModifierContext,\n ReactiveModifierProps,\n StyleComputationContext,\n} from './types'\nimport { ModifierPriority } from '@tachui/core/modifiers/types'\nimport {\n isInfinity,\n dimensionToCSS,\n shouldExpandForInfinity,\n} from '@tachui/core/constants/layout'\n\n/**\n * Abstract base modifier class\n */\nexport abstract class BaseModifier<TProps = {}> implements Modifier<TProps> {\n abstract readonly type: string\n abstract readonly priority: number\n\n constructor(public readonly properties: TProps) {}\n\n /**\n * Apply the modifier to a DOM node\n */\n abstract apply(node: DOMNode, context: ModifierContext): DOMNode | undefined\n\n /**\n * Helper to resolve reactive properties\n */\n protected resolveReactiveProps<T extends Record<string, any>>(\n props: ReactiveModifierProps<T>,\n context: StyleComputationContext\n ): T {\n const resolved = {} as T\n\n for (const [key, value] of Object.entries(props)) {\n if (isSignal(value) || isComputed(value)) {\n // Preserve the signal/computed - let applyStyles handle reactivity\n resolved[key as keyof T] = value as T[keyof T]\n } else {\n // Static value\n resolved[key as keyof T] = value\n }\n }\n\n // Context parameter is kept for compatibility but not used in new approach\n void context\n\n return resolved\n }\n\n /**\n * Apply a single style change to an element with reactive support\n */\n protected applyStyleChange(\n element: Element,\n property: string,\n value: any\n ): void {\n if (element instanceof HTMLElement) {\n const cssProperty = this.toCSSProperty(property)\n\n // Handle reactive values (signals and computed)\n if (isSignal(value) || isComputed(value)) {\n // Create reactive effect for this style property\n createEffect(() => {\n const currentValue = value()\n const cssValue = String(currentValue)\n\n // Check if value contains !important and handle it properly\n if (cssValue.includes('!important')) {\n const actualValue = cssValue.replace(/\\s*!important\\s*$/, '').trim()\n element.style.setProperty(cssProperty, actualValue, 'important')\n } else {\n element.style.setProperty(cssProperty, cssValue)\n }\n })\n } else {\n // Handle static values\n const cssValue = String(value)\n\n // Check if value contains !important and handle it properly\n if (cssValue.includes('!important')) {\n const actualValue = cssValue.replace(/\\s*!important\\s*$/, '').trim()\n element.style.setProperty(cssProperty, actualValue, 'important')\n } else {\n element.style.setProperty(cssProperty, cssValue)\n }\n }\n }\n }\n\n /**\n * Convert camelCase property to CSS kebab-case\n */\n protected toCSSProperty(property: string): string {\n return property.replace(/([A-Z])/g, '-$1').toLowerCase()\n }\n\n /**\n * Convert value to CSS value string\n */\n protected toCSSValue(value: any): string {\n if (typeof value === 'number') {\n return `${value}px`\n }\n return String(value)\n }\n\n /**\n * Convert value to CSS value string with property-specific handling\n */\n protected toCSSValueForProperty(property: string, value: any): string {\n if (typeof value === 'number') {\n // Properties that should be unitless\n const unitlessProperties = [\n 'opacity',\n 'z-index',\n 'line-height',\n 'flex-grow',\n 'flex-shrink',\n 'order',\n 'column-count',\n 'font-weight',\n ]\n\n if (unitlessProperties.includes(property)) {\n return String(value)\n }\n\n return `${value}px`\n }\n\n // Properties that should be passed through as-is (no processing)\n const passthroughProperties = [\n 'filter', // CSS filter strings should not be processed\n 'transform', // CSS transform strings\n 'clip-path', // CSS clip-path strings\n ]\n\n if (passthroughProperties.includes(property)) {\n return String(value)\n }\n\n return String(value)\n }\n\n /**\n * Apply multiple CSS properties to an element with reactive support\n */\n protected applyStyles(element: Element, styles: CSSStyleProperties): void {\n // Check if element has a style property (for testing and real elements)\n if (element instanceof HTMLElement || (element as any).style) {\n const styleTarget =\n element instanceof HTMLElement ? element.style : (element as any).style\n\n for (const [property, value] of Object.entries(styles)) {\n if (value !== undefined) {\n const cssProperty = this.toCSSProperty(property)\n\n // Handle reactive values (signals and computed)\n if (isSignal(value) || isComputed(value)) {\n // Create reactive effect for this style property\n createEffect(() => {\n const currentValue = value()\n const cssValue = this.toCSSValueForProperty(\n cssProperty,\n currentValue\n )\n\n if (styleTarget.setProperty) {\n // Check if value contains !important and handle it properly\n if (\n typeof cssValue === 'string' &&\n cssValue.includes('!important')\n ) {\n const actualValue = cssValue\n .replace(/\\s*!important\\s*$/, '')\n .trim()\n styleTarget.setProperty(cssProperty, actualValue, 'important')\n } else {\n styleTarget.setProperty(cssProperty, cssValue)\n }\n } else {\n ;(styleTarget as any)[cssProperty] = cssValue\n }\n })\n } else {\n // Handle static values\n const cssValue = this.toCSSValueForProperty(cssProperty, value)\n\n if (styleTarget.setProperty) {\n // Check if value contains !important and handle it properly\n if (\n typeof cssValue === 'string' &&\n cssValue.includes('!important')\n ) {\n const actualValue = cssValue\n .replace(/\\s*!important\\s*$/, '')\n .trim()\n styleTarget.setProperty(cssProperty, actualValue, 'important')\n } else {\n styleTarget.setProperty(cssProperty, cssValue)\n }\n } else {\n ;(styleTarget as any)[cssProperty] = cssValue\n }\n }\n }\n }\n }\n }\n\n /**\n * Add CSS classes to an element\n */\n protected addClasses(element: Element, classes: string[]): void {\n if (element instanceof HTMLElement) {\n element.classList.add(...classes)\n }\n }\n\n /**\n * Remove CSS classes from an element\n */\n protected removeClasses(element: Element, classes: string[]): void {\n if (element instanceof HTMLElement) {\n element.classList.remove(...classes)\n }\n }\n\n /**\n * Create a style computation context\n */\n protected createStyleContext(\n componentId: string,\n element: Element,\n modifiers: Modifier[]\n ): StyleComputationContext {\n return {\n componentId,\n element,\n modifiers,\n signals: new Set(),\n cleanup: [],\n }\n }\n}\n\n/**\n * Layout modifier for frame, padding, margin\n */\nexport class LayoutModifier extends BaseModifier {\n readonly type = 'layout'\n readonly priority = ModifierPriority.LAYOUT\n\n apply(node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!node.element || !context.element) return\n\n const styleContext = this.createStyleContext(\n context.componentId,\n context.element,\n []\n )\n\n const styles = this.computeLayoutStyles(\n this.properties as any,\n styleContext\n )\n\n this.applyStyles(context.element, styles)\n\n // Handle offset separately for proper transform combining\n const props = this.properties as any\n if (props.offset && context.element instanceof HTMLElement) {\n this.applyOffsetTransform(context.element, props.offset)\n }\n\n // Handle aspectRatio separately for reactive support\n if (props.aspectRatio && context.element instanceof HTMLElement) {\n this.applyAspectRatio(context.element, props.aspectRatio)\n }\n\n // Handle scaleEffect separately for proper transform combining (Phase 3 - Epic: Butternut)\n if (props.scaleEffect && context.element instanceof HTMLElement) {\n this.applyScaleTransform(context.element, props.scaleEffect)\n }\n\n // Handle absolutePosition separately for proper positioning (Phase 3 - Epic: Butternut)\n if (props.position && context.element instanceof HTMLElement) {\n this.applyAbsolutePosition(context.element, props.position)\n }\n\n // Handle zIndex separately for proper layering (Phase 3 - Epic: Butternut)\n if (props.zIndex !== undefined && context.element instanceof HTMLElement) {\n this.applyZIndex(context.element, props.zIndex)\n }\n\n return undefined\n }\n\n private applyOffsetTransform(\n element: HTMLElement,\n offset: { x?: any; y?: any }\n ): void {\n const { x, y } = offset\n\n // Handle reactive values\n if (isSignal(x) || isComputed(x) || isSignal(y) || isComputed(y)) {\n createEffect(() => {\n const currentX = isSignal(x) || isComputed(x) ? x() : (x ?? 0)\n const currentY = isSignal(y) || isComputed(y) ? y() : (y ?? 0)\n\n const offsetX = this.toCSSValue(currentX)\n const offsetY = this.toCSSValue(currentY)\n const translateValue = `translate(${offsetX}, ${offsetY})`\n\n // Preserve existing transforms but replace any existing translate\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('translate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${translateValue}`\n : translateValue\n\n element.style.transform = newTransform\n })\n } else {\n // Handle static values\n const currentX = x ?? 0\n const currentY = y ?? 0\n\n const offsetX = this.toCSSValue(currentX)\n const offsetY = this.toCSSValue(currentY)\n const translateValue = `translate(${offsetX}, ${offsetY})`\n\n // Preserve existing transforms but replace any existing translate\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('translate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${translateValue}`\n : translateValue\n\n element.style.transform = newTransform\n }\n }\n\n private applyAspectRatio(\n element: HTMLElement,\n aspectRatio: { ratio?: any; contentMode?: 'fit' | 'fill' }\n ): void {\n const { ratio, contentMode } = aspectRatio\n\n if (ratio !== undefined) {\n // Handle reactive aspect ratio\n if (isSignal(ratio) || isComputed(ratio)) {\n createEffect(() => {\n const currentRatio = typeof ratio === 'function' ? ratio() : ratio\n element.style.aspectRatio = String(currentRatio)\n })\n } else {\n element.style.aspectRatio = String(ratio)\n }\n\n // Set content mode\n if (contentMode === 'fill') {\n element.style.objectFit = 'cover'\n } else {\n element.style.objectFit = 'contain'\n }\n }\n }\n\n // Phase 3 - Epic: Butternut Transform Methods\n\n private applyScaleTransform(\n element: HTMLElement,\n scaleEffect: { x?: any; y?: any; anchor?: string }\n ): void {\n const { x, y, anchor } = scaleEffect\n const scaleX = x ?? 1\n const scaleY = y ?? scaleX // Default to uniform scaling if y not provided\n\n // Handle reactive values\n if (\n isSignal(scaleX) ||\n isComputed(scaleX) ||\n isSignal(scaleY) ||\n isComputed(scaleY)\n ) {\n createEffect(() => {\n const currentX =\n isSignal(scaleX) || isComputed(scaleX) ? scaleX() : scaleX\n const currentY =\n isSignal(scaleY) || isComputed(scaleY) ? scaleY() : scaleY\n\n const scaleValue = `scale(${currentX}, ${currentY})`\n\n // Set transform-origin based on anchor\n element.style.transformOrigin = this.getTransformOrigin(\n anchor || 'center'\n )\n\n // Preserve existing transforms but replace any existing scale\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .replace(/\\s*scale\\([^)]*\\)\\s*/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${scaleValue}`\n : scaleValue\n\n element.style.transform = newTransform\n })\n } else {\n // Handle static values\n const scaleValue = `scale(${scaleX}, ${scaleY})`\n\n // Set transform-origin based on anchor\n element.style.transformOrigin = this.getTransformOrigin(\n anchor || 'center'\n )\n\n // Preserve existing transforms but replace any existing scale\n const existingTransform = element.style.transform || ''\n const existingTransforms = existingTransform\n .replace(/\\s*scale\\([^)]*\\)\\s*/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${scaleValue}`\n : scaleValue\n\n element.style.transform = newTransform\n }\n }\n\n private applyAbsolutePosition(\n element: HTMLElement,\n position: { x?: any; y?: any }\n ): void {\n const { x, y } = position\n\n // Set position to absolute for SwiftUI-style absolute positioning\n element.style.position = 'absolute'\n\n // Handle reactive values\n if (isSignal(x) || isComputed(x) || isSignal(y) || isComputed(y)) {\n createEffect(() => {\n const currentX = isSignal(x) || isComputed(x) ? x() : (x ?? 0)\n const currentY = isSignal(y) || isComputed(y) ? y() : (y ?? 0)\n\n element.style.left = this.toCSSValue(currentX)\n element.style.top = this.toCSSValue(currentY)\n })\n } else {\n // Handle static values\n const currentX = x ?? 0\n const currentY = y ?? 0\n\n element.style.left = this.toCSSValue(currentX)\n element.style.top = this.toCSSValue(currentY)\n }\n }\n\n private applyZIndex(element: HTMLElement, zIndex: any): void {\n // Handle reactive values\n if (isSignal(zIndex) || isComputed(zIndex)) {\n createEffect(() => {\n const currentZIndex = zIndex()\n element.style.zIndex = String(currentZIndex)\n })\n } else {\n // Handle static values\n element.style.zIndex = String(zIndex)\n }\n }\n\n private getTransformOrigin(anchor: string): string {\n const anchorMap: Record<string, string> = {\n center: 'center center',\n top: 'center top',\n topLeading: 'left top',\n topTrailing: 'right top',\n bottom: 'center bottom',\n bottomLeading: 'left bottom',\n bottomTrailing: 'right bottom',\n leading: 'left center',\n trailing: 'right center',\n }\n\n return anchorMap[anchor] || 'center center'\n }\n\n private computeLayoutStyles(\n props: any,\n _context: StyleComputationContext\n ): CSSStyleProperties {\n const styles: CSSStyleProperties = {}\n\n // Frame properties - handle infinity values properly\n if (props.frame) {\n const frame = props.frame\n\n // Check for infinity constraints and apply appropriate flex/size styles\n const infinityResult = shouldExpandForInfinity(frame)\n Object.assign(styles, infinityResult.cssProps)\n\n // Convert dimensions to CSS, handling infinity appropriately\n // Don't apply explicit width/height if infinity expansion is happening\n if (frame.width !== undefined) {\n const cssValue = dimensionToCSS(frame.width)\n if (\n cssValue !== undefined &&\n !isInfinity(frame.width) &&\n !infinityResult.expandWidth\n ) {\n styles.width = cssValue\n }\n }\n\n if (frame.height !== undefined) {\n const cssValue = dimensionToCSS(frame.height)\n if (\n cssValue !== undefined &&\n !isInfinity(frame.height) &&\n !infinityResult.expandHeight\n ) {\n styles.height = cssValue\n }\n }\n\n if (frame.minWidth !== undefined) {\n const cssValue = dimensionToCSS(frame.minWidth)\n if (cssValue !== undefined) {\n styles.minWidth = cssValue\n }\n }\n\n if (frame.maxWidth !== undefined && !isInfinity(frame.maxWidth)) {\n const cssValue = dimensionToCSS(frame.maxWidth)\n if (cssValue !== undefined) {\n styles.maxWidth = cssValue\n }\n } else if (isInfinity(frame.maxWidth)) {\n // SwiftUI compatibility: maxWidth infinity means expand to fill available width\n // Remove maxWidth constraint and use flex properties for expansion\n styles.maxWidth = 'none'\n styles.flexGrow = '1 !important'\n styles.flexShrink = '1 !important'\n styles.flexBasis = '0% !important'\n styles.alignSelf = 'stretch !important'\n }\n\n if (frame.minHeight !== undefined) {\n const cssValue = dimensionToCSS(frame.minHeight)\n if (cssValue !== undefined) {\n styles.minHeight = cssValue\n }\n }\n\n if (frame.maxHeight !== undefined && !isInfinity(frame.maxHeight)) {\n const cssValue = dimensionToCSS(frame.maxHeight)\n if (cssValue !== undefined) {\n styles.maxHeight = cssValue\n }\n } else if (isInfinity(frame.maxHeight)) {\n // SwiftUI compatibility: maxHeight infinity means expand to fill available height\n // Remove maxHeight constraint and use flex properties for expansion\n styles.maxHeight = 'none'\n styles.flexGrow = '1 !important'\n styles.flexShrink = '1 !important'\n styles.flexBasis = '0% !important'\n styles.alignSelf = 'stretch !important'\n }\n }\n\n // Padding\n if (props.padding !== undefined) {\n if (typeof props.padding === 'number') {\n styles.padding = this.toCSSValue(props.padding)\n } else {\n const p = props.padding\n if (p.top !== undefined) styles.paddingTop = this.toCSSValue(p.top)\n if (p.right !== undefined)\n styles.paddingRight = this.toCSSValue(p.right)\n if (p.bottom !== undefined)\n styles.paddingBottom = this.toCSSValue(p.bottom)\n if (p.left !== undefined) styles.paddingLeft = this.toCSSValue(p.left)\n }\n }\n\n // Margin\n if (props.margin !== undefined) {\n if (typeof props.margin === 'number') {\n styles.margin = this.toCSSValue(props.margin)\n } else {\n const m = props.margin\n if (m.top !== undefined) styles.marginTop = this.toCSSValue(m.top)\n if (m.right !== undefined) styles.marginRight = this.toCSSValue(m.right)\n if (m.bottom !== undefined)\n styles.marginBottom = this.toCSSValue(m.bottom)\n if (m.left !== undefined) styles.marginLeft = this.toCSSValue(m.left)\n }\n }\n\n // Alignment\n if (props.alignment) {\n switch (props.alignment) {\n case 'leading':\n styles.textAlign = 'left'\n styles.alignItems = 'flex-start'\n break\n case 'center':\n styles.textAlign = 'center'\n styles.alignItems = 'center'\n break\n case 'trailing':\n styles.textAlign = 'right'\n styles.alignItems = 'flex-end'\n break\n case 'top':\n styles.alignItems = 'flex-start'\n break\n case 'bottom':\n styles.alignItems = 'flex-end'\n break\n }\n }\n\n // Layout Priority\n // In SwiftUI, layoutPriority determines which views get priority in sizing\n // Higher priority views determine container size in ZStack\n // We implement this using CSS flexbox properties for flexible layouts\n if (props.layoutPriority !== undefined) {\n const priority = Number(props.layoutPriority)\n\n // Set flex properties based on priority\n // Higher priority = less flex shrink, more flex grow\n if (priority > 0) {\n // High priority: Don't shrink, allow growth\n styles.flexShrink = '0'\n styles.flexGrow = String(Math.max(1, priority / 10))\n\n // For ZStack containers, higher priority elements determine size\n // We use z-index for layering and flex properties for sizing behavior\n styles.zIndex = String(priority)\n\n // In grid layouts, higher priority gets more space\n styles.gridRowEnd = `span ${String(Math.min(10, Math.max(1, Math.ceil(priority / 10))))}`\n styles.gridColumnEnd = `span ${String(Math.min(10, Math.max(1, Math.ceil(priority / 10))))}`\n } else if (priority === 0) {\n // Default priority: Normal flex behavior\n styles.flexShrink = '1'\n styles.flexGrow = '1'\n } else {\n // Low priority: Shrink more, grow less\n styles.flexShrink = String(Math.abs(priority))\n styles.flexGrow = '0'\n styles.zIndex = String(priority)\n }\n\n // For containers that need to size based on highest priority child\n // We use CSS custom properties that can be read by parent containers\n if (styles && typeof styles === 'object' && 'setProperty' in styles) {\n ;(styles as any).setProperty('--layout-priority', String(priority))\n }\n }\n\n // Offset modifier (SwiftUI .offset(x, y))\n // Note: Offset handling is done in the apply method with proper reactive support\n // This is just for setting up the basic structure\n if (props.offset) {\n // The actual transform application happens in apply() method\n // to handle both reactive and static values properly\n }\n\n // Aspect Ratio modifier (SwiftUI .aspectRatio(ratio, contentMode))\n if (props.aspectRatio) {\n const { ratio, contentMode } = props.aspectRatio\n\n if (ratio !== undefined) {\n // Apply CSS aspect-ratio property\n styles.aspectRatio = typeof ratio === 'number' ? String(ratio) : ratio\n\n // Handle content mode\n if (contentMode === 'fill') {\n styles.objectFit = 'cover'\n } else {\n styles.objectFit = 'contain'\n }\n }\n }\n\n // Fixed Size modifier (SwiftUI .fixedSize())\n if (props.fixedSize) {\n const { horizontal, vertical } = props.fixedSize\n\n if (horizontal) {\n styles.flexShrink = '0'\n styles.width = 'max-content'\n }\n if (vertical) {\n styles.flexShrink = '0'\n styles.height = 'max-content'\n }\n }\n\n return styles\n }\n}\n\n/**\n * Appearance modifier for colors, fonts, borders, shadows\n */\nexport class AppearanceModifier extends BaseModifier {\n readonly type = 'appearance'\n readonly priority = ModifierPriority.APPEARANCE\n\n apply(node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!node.element || !context.element) {\n return\n }\n\n const styleContext = this.createStyleContext(\n context.componentId,\n context.element,\n []\n )\n\n const resolved = this.resolveReactiveProps(\n this.properties as any,\n styleContext\n )\n\n // Handle Assets separately with theme reactivity\n this.applyAssetBasedStyles(context.element, resolved)\n\n // Handle non-Asset styles normally\n const styles = this.computeAppearanceStyles(resolved)\n this.applyStyles(context.element, styles)\n\n // Handle HTML attributes (ARIA, role, navigation, etc.)\n this.applyAttributes(context.element, resolved)\n\n return undefined\n }\n\n /**\n * Apply Asset-based styles with theme reactivity\n */\n private applyAssetBasedStyles(element: Element, props: any): void {\n // Get the shared theme signal\n const themeSignal = getThemeSignal()\n\n // Handle foregroundColor Asset\n if (props.foregroundColor && this.isAsset(props.foregroundColor)) {\n createEffect(() => {\n // Watch theme changes to trigger re-resolution\n themeSignal()\n // Re-resolve Asset when theme changes\n const resolvedColor = props.foregroundColor.resolve()\n this.applyStyleChange(element, 'color', resolvedColor)\n })\n }\n\n // Handle backgroundColor Asset\n if (props.backgroundColor && this.isAsset(props.backgroundColor)) {\n createEffect(() => {\n // Watch theme changes to trigger re-resolution\n themeSignal()\n // Re-resolve Asset when theme changes\n const resolvedColor = props.backgroundColor.resolve()\n this.applyStyleChange(element, 'backgroundColor', resolvedColor)\n })\n }\n\n // Handle border color Asset\n if (props.border?.color && this.isAsset(props.border.color)) {\n createEffect(() => {\n // Watch theme changes\n themeSignal()\n // Re-resolve Asset when theme changes\n const resolvedColor = props.border.color.resolve()\n this.applyStyleChange(element, 'borderColor', resolvedColor)\n })\n }\n }\n\n /**\n * Check if a value is an Asset object (including Asset proxies)\n */\n private isAsset(value: any): boolean {\n return (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n 'resolve' in value &&\n typeof value.resolve === 'function'\n )\n }\n\n private computeAppearanceStyles(props: any): CSSStyleProperties {\n const styles: CSSStyleProperties = {}\n\n // Colors (skip Assets - they're handled reactively in applyAssetBasedStyles)\n if (props.foregroundColor && !this.isAsset(props.foregroundColor)) {\n styles.color = props.foregroundColor\n }\n if (props.backgroundColor && !this.isAsset(props.backgroundColor)) {\n styles.backgroundColor = props.backgroundColor\n }\n if (props.opacity !== undefined) styles.opacity = props.opacity\n\n // Font\n if (props.font) {\n const font = props.font\n if (font.family) {\n // Handle FontAsset objects that need to be resolved\n if (\n typeof font.family === 'object' &&\n font.family !== null &&\n 'resolve' in font.family\n ) {\n styles.fontFamily = (font.family as any).resolve()\n } else {\n styles.fontFamily = font.family as string\n }\n }\n if (font.size) styles.fontSize = this.toCSSValue(font.size)\n if (font.weight) styles.fontWeight = String(font.weight)\n if (font.style) styles.fontStyle = font.style\n }\n\n // Corner radius\n if (props.cornerRadius !== undefined) {\n styles.borderRadius = this.toCSSValue(props.cornerRadius)\n }\n\n // Border\n if (props.border) {\n const border = props.border\n if (border.width !== undefined)\n styles.borderWidth = this.toCSSValue(border.width)\n if (border.color && !this.isAsset(border.color)) {\n styles.borderColor = border.color as string\n }\n if (border.style) styles.borderStyle = border.style\n }\n\n // Shadow\n if (props.shadow) {\n const shadow = props.shadow\n const x = shadow.x || 0\n const y = shadow.y || 0\n const radius = shadow.radius || 0\n const color = shadow.color || 'rgba(0,0,0,0.25)'\n styles.boxShadow = `${x}px ${y}px ${radius}px ${color}`\n }\n\n // Clipped modifier (SwiftUI .clipped())\n if (props.clipped) {\n styles.overflow = 'hidden'\n }\n\n // Clip Shape modifier (SwiftUI .clipShape())\n if (props.clipShape) {\n const { shape, parameters } = props.clipShape\n\n switch (shape) {\n case 'circle':\n styles.clipPath = 'circle(50%)'\n break\n case 'ellipse': {\n const radiusX = parameters?.radiusX || '50%'\n const radiusY = parameters?.radiusY || '50%'\n styles.clipPath = `ellipse(${radiusX} ${radiusY} at center)`\n break\n }\n case 'rect': {\n const inset = parameters?.inset || 0\n styles.clipPath = `inset(${inset}px)`\n break\n }\n case 'polygon': {\n const points =\n parameters?.points || '0% 0%, 100% 0%, 100% 100%, 0% 100%'\n styles.clipPath = `polygon(${points})`\n break\n }\n }\n }\n\n // Visual Effects (Phase 2 - Epic: Butternut)\n const filters: string[] = []\n\n if (props.blur !== undefined) {\n filters.push(`blur(${props.blur}px)`)\n }\n if (props.brightness !== undefined) {\n filters.push(`brightness(${props.brightness})`)\n }\n if (props.contrast !== undefined) {\n filters.push(`contrast(${props.contrast})`)\n }\n if (props.saturation !== undefined) {\n filters.push(`saturate(${props.saturation})`)\n }\n if (props.hueRotation !== undefined) {\n filters.push(`hue-rotate(${props.hueRotation}deg)`)\n }\n if (props.grayscale !== undefined) {\n filters.push(`grayscale(${props.grayscale})`)\n }\n if (props.colorInvert !== undefined) {\n filters.push(`invert(${props.colorInvert})`)\n }\n\n if (filters.length > 0) {\n styles.filter = filters.join(' ')\n }\n\n return styles\n }\n\n /**\n * Apply HTML attributes (ARIA, role, data attributes, etc.)\n */\n private applyAttributes(element: Element, props: any): void {\n if (!element) return\n\n // Also need to get the component from the context to update props\n // This is a hack, but needed for tests that expect attributes on component.props\n const component = this.findComponentFromElement(element)\n\n // Common HTML attributes\n if (props.role !== undefined) {\n element.setAttribute('role', String(props.role))\n if (component?.props) {\n component.props.role = String(props.role)\n }\n }\n\n // ARIA attributes\n if (props['aria-label'] !== undefined) {\n element.setAttribute('aria-label', String(props['aria-label']))\n if (component?.props) {\n component.props['aria-label'] = String(props['aria-label'])\n }\n }\n\n if (props['aria-live'] !== undefined) {\n element.setAttribute('aria-live', String(props['aria-live']))\n if (component?.props) {\n component.props['aria-live'] = String(props['aria-live'])\n }\n }\n\n if (props['aria-describedby'] !== undefined) {\n element.setAttribute(\n 'aria-describedby',\n String(props['aria-describedby'])\n )\n if (component?.props) {\n component.props['aria-describedby'] = String(props['aria-describedby'])\n }\n }\n\n if (props['aria-modal'] !== undefined) {\n element.setAttribute('aria-modal', String(props['aria-modal']))\n if (component?.props) {\n component.props['aria-modal'] = String(props['aria-modal'])\n }\n }\n\n if (props['aria-hidden'] !== undefined) {\n element.setAttribute('aria-hidden', String(props['aria-hidden']))\n if (component?.props) {\n component.props['aria-hidden'] = String(props['aria-hidden'])\n }\n }\n\n // Navigation attributes (for custom processing by navigation system)\n if (props.navigationTitle !== undefined) {\n element.setAttribute(\n 'data-navigation-title',\n String(props.navigationTitle)\n )\n if (component?.props) {\n component.props.navigationTitle = String(props.navigationTitle)\n }\n }\n\n if (props.navigationBarHidden !== undefined) {\n element.setAttribute(\n 'data-navigation-bar-hidden',\n String(props.navigationBarHidden)\n )\n if (component?.props) {\n component.props.navigationBarHidden = props.navigationBarHidden\n }\n // Also apply aria-hidden for accessibility\n if (props.navigationBarHidden) {\n element.setAttribute('aria-hidden', 'true')\n if (component?.props) {\n component.props['aria-hidden'] = 'true'\n }\n }\n }\n\n if (props.navigationBarItems !== undefined) {\n // Store as JSON in data attribute for navigation system to process\n element.setAttribute(\n 'data-navigation-bar-items',\n JSON.stringify(props.navigationBarItems)\n )\n if (component?.props) {\n component.props.navigationBarItems = props.navigationBarItems\n }\n }\n }\n\n private findComponentFromElement(element: Element): any {\n // Try to find the component instance associated with this element\n // This is a simplified approach - in a real implementation, we'd have a proper mapping\n return (element as any)._tachui_component || null\n }\n}\n\n/**\n * Interaction modifier for events and accessibility\n */\nexport class InteractionModifier extends BaseModifier {\n readonly type = 'interaction'\n readonly priority = ModifierPriority.INTERACTION\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const props = this.properties as any\n\n // Event handlers\n if (props.onTap) {\n context.element.addEventListener('click', props.onTap)\n }\n\n if (props.onHover) {\n context.element.addEventListener('mouseenter', () => props.onHover(true))\n context.element.addEventListener('mouseleave', () => props.onHover(false))\n }\n\n if (props.onMouseEnter) {\n context.element.addEventListener('mouseenter', props.onMouseEnter)\n }\n\n if (props.onMouseLeave) {\n context.element.addEventListener('mouseleave', props.onMouseLeave)\n }\n\n if (props.onMouseDown) {\n context.element.addEventListener('mousedown', props.onMouseDown)\n }\n\n if (props.onMouseUp) {\n context.element.addEventListener('mouseup', props.onMouseUp)\n }\n\n if (props.onDragStart) {\n context.element.addEventListener('dragstart', props.onDragStart)\n }\n\n if (props.onDragOver) {\n context.element.addEventListener('dragover', props.onDragOver)\n }\n\n if (props.onDragLeave) {\n context.element.addEventListener('dragleave', props.onDragLeave)\n }\n\n if (props.onDrop) {\n context.element.addEventListener('drop', props.onDrop)\n }\n\n // Additional mouse events\n if (props.onDoubleClick) {\n context.element.addEventListener('dblclick', props.onDoubleClick)\n }\n\n if (props.onContextMenu) {\n context.element.addEventListener('contextmenu', props.onContextMenu)\n }\n\n // Focus events\n if (props.onFocus) {\n context.element.addEventListener('focus', () => props.onFocus(true))\n context.element.addEventListener('blur', () => props.onFocus(false))\n }\n\n if (props.onBlur) {\n context.element.addEventListener('blur', () => props.onBlur(false))\n }\n\n // Keyboard events\n if (props.onKeyPress) {\n context.element.addEventListener('keypress', props.onKeyPress)\n }\n\n if (props.onKeyDown) {\n context.element.addEventListener('keydown', props.onKeyDown)\n }\n\n if (props.onKeyUp) {\n context.element.addEventListener('keyup', props.onKeyUp)\n }\n\n // Touch events\n if (props.onTouchStart) {\n context.element.addEventListener('touchstart', props.onTouchStart, {\n passive: true,\n })\n }\n\n if (props.onTouchMove) {\n context.element.addEventListener('touchmove', props.onTouchMove, {\n passive: true,\n })\n }\n\n if (props.onTouchEnd) {\n context.element.addEventListener('touchend', props.onTouchEnd, {\n passive: true,\n })\n }\n\n if (props.onTouchCancel) {\n context.element.addEventListener('touchcancel', props.onTouchCancel, {\n passive: true,\n })\n }\n\n // Swipe gestures (simplified implementation)\n if (props.onSwipeLeft || props.onSwipeRight) {\n let startX = 0\n let startY = 0\n\n context.element.addEventListener(\n 'touchstart',\n (e: Event) => {\n const touchEvent = e as TouchEvent\n const touch = touchEvent.touches[0]\n startX = touch.clientX\n startY = touch.clientY\n },\n { passive: true }\n )\n\n context.element.addEventListener(\n 'touchend',\n (e: Event) => {\n const touchEvent = e as TouchEvent\n const touch = touchEvent.changedTouches[0]\n const deltaX = touch.clientX - startX\n const deltaY = touch.clientY - startY\n const minSwipeDistance = 50\n\n // Only register as swipe if horizontal movement is greater than vertical\n if (\n Math.abs(deltaX) > Math.abs(deltaY) &&\n Math.abs(deltaX) > minSwipeDistance\n ) {\n if (deltaX < 0 && props.onSwipeLeft) {\n props.onSwipeLeft()\n } else if (deltaX > 0 && props.onSwipeRight) {\n props.onSwipeRight()\n }\n }\n },\n { passive: true }\n )\n }\n\n // Scroll and wheel events\n if (props.onScroll) {\n context.element.addEventListener('scroll', props.onScroll, {\n passive: true,\n })\n }\n\n if (props.onWheel) {\n context.element.addEventListener('wheel', props.onWheel, {\n passive: false,\n })\n }\n\n // Input events\n if (props.onInput) {\n context.element.addEventListener('input', props.onInput)\n }\n\n if (props.onChange) {\n context.element.addEventListener('change', event => {\n const target = event.target as HTMLInputElement\n const value = target.value || target.textContent || ''\n props.onChange(value, event)\n })\n }\n\n // Clipboard events\n if (props.onCopy) {\n context.element.addEventListener('copy', props.onCopy)\n }\n\n if (props.onCut) {\n context.element.addEventListener('cut', props.onCut)\n }\n\n if (props.onPaste) {\n context.element.addEventListener('paste', props.onPaste)\n }\n\n // Selection events\n if (props.onSelect) {\n context.element.addEventListener('select', props.onSelect)\n }\n\n // Disabled state\n if (props.disabled !== undefined) {\n if (context.element instanceof HTMLElement) {\n if (props.disabled) {\n context.element.setAttribute('disabled', 'true')\n context.element.style.pointerEvents = 'none'\n context.element.style.opacity = '0.6'\n } else {\n context.element.removeAttribute('disabled')\n context.element.style.pointerEvents = ''\n context.element.style.opacity = ''\n }\n }\n }\n\n // Draggable state\n if (props.draggable !== undefined) {\n if (context.element instanceof HTMLElement) {\n context.element.draggable = props.draggable\n }\n }\n\n // Accessibility\n if (props.accessibilityLabel) {\n context.element.setAttribute('aria-label', props.accessibilityLabel)\n }\n\n if (props.accessibilityHint) {\n context.element.setAttribute('aria-describedby', props.accessibilityHint)\n }\n\n // Advanced Gesture Modifiers (Phase 4 - Epic: Butternut)\n if (props.onLongPressGesture) {\n this.setupLongPressGesture(context.element, props.onLongPressGesture)\n }\n\n if (props.keyboardShortcut) {\n this.setupKeyboardShortcut(context.element, props.keyboardShortcut)\n }\n\n if (props.focused !== undefined) {\n this.setupFocusManagement(context.element, props.focused)\n }\n\n if (props.focusable) {\n this.setupFocusable(context.element, props.focusable)\n }\n\n if (props.onContinuousHover) {\n this.setupContinuousHover(context.element, props.onContinuousHover)\n }\n\n if (props.allowsHitTesting !== undefined) {\n this.setupHitTesting(context.element, props.allowsHitTesting)\n }\n\n return undefined\n }\n\n // Phase 4 Advanced Gesture Methods\n\n /**\n * Setup long press gesture with timing and distance constraints\n */\n private setupLongPressGesture(\n element: Element,\n options: {\n minimumDuration?: number\n maximumDistance?: number\n perform: () => void\n onPressingChanged?: (isPressing: boolean) => void\n }\n ): void {\n const minimumDuration = options.minimumDuration ?? 500 // ms\n const maximumDistance = options.maximumDistance ?? 10 // px\n\n let timeoutId: number | undefined\n let startPoint: { x: number; y: number } | null = null\n let isPressing = false\n\n const cleanup = () => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = undefined\n }\n if (isPressing && options.onPressingChanged) {\n options.onPressingChanged(false)\n }\n isPressing = false\n startPoint = null\n }\n\n const handlePointerDown = (event: Event) => {\n const pointerEvent = event as PointerEvent\n startPoint = { x: pointerEvent.clientX, y: pointerEvent.clientY }\n isPressing = true\n\n if (options.onPressingChanged) {\n options.onPressingChanged(true)\n }\n\n timeoutId = window.setTimeout(() => {\n if (isPressing && startPoint) {\n options.perform()\n cleanup()\n }\n }, minimumDuration)\n }\n\n const handlePointerMove = (event: Event) => {\n const pointerEvent = event as PointerEvent\n if (!startPoint || !isPressing) return\n\n const distance = Math.sqrt(\n Math.pow(pointerEvent.clientX - startPoint.x, 2) +\n Math.pow(pointerEvent.clientY - startPoint.y, 2)\n )\n\n if (distance > maximumDistance) {\n cleanup()\n }\n }\n\n const handlePointerUp = () => {\n cleanup()\n }\n\n const handlePointerCancel = () => {\n cleanup()\n }\n\n // Use pointer events for better touch/mouse compatibility\n element.addEventListener('pointerdown', handlePointerDown as EventListener)\n element.addEventListener('pointermove', handlePointerMove as EventListener)\n element.addEventListener('pointerup', handlePointerUp as EventListener)\n element.addEventListener(\n 'pointercancel',\n handlePointerCancel as EventListener\n )\n\n // Store cleanup function for later removal\n ;(element as any)._longPressCleanup = cleanup\n }\n\n /**\n * Setup keyboard shortcut handling\n */\n private setupKeyboardShortcut(\n element: Element,\n shortcut: {\n key: string\n modifiers?: ('cmd' | 'ctrl' | 'shift' | 'alt' | 'meta')[]\n action: () => void\n }\n ): void {\n const modifiers = shortcut.modifiers ?? []\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // Check if all required modifiers are pressed\n const requiredModifiers = {\n cmd: modifiers.includes('cmd') || modifiers.includes('meta'),\n ctrl: modifiers.includes('ctrl'),\n shift: modifiers.includes('shift'),\n alt: modifiers.includes('alt'),\n }\n\n const actualModifiers = {\n cmd: event.metaKey || event.ctrlKey, // Handle both Mac (meta) and PC (ctrl)\n ctrl: event.ctrlKey,\n shift: event.shiftKey,\n alt: event.altKey,\n }\n\n // Check key match (case insensitive)\n const keyMatches = event.key.toLowerCase() === shortcut.key.toLowerCase()\n\n // Check modifier requirements\n const modifiersMatch = Object.entries(requiredModifiers).every(\n ([mod, required]) =>\n required === actualModifiers[mod as keyof typeof actualModifiers]\n )\n\n if (keyMatches && modifiersMatch) {\n event.preventDefault()\n shortcut.action()\n }\n }\n\n // Add keyboard event listener to document for global shortcuts\n document.addEventListener('keydown', handleKeyDown)\n\n // Store cleanup function\n ;(element as any)._keyboardShortcutCleanup = () => {\n document.removeEventListener('keydown', handleKeyDown)\n }\n }\n\n /**\n * Setup focus management with reactive binding\n */\n private setupFocusManagement(\n element: Element,\n focused: boolean | Signal<boolean>\n ): void {\n if (!(element instanceof HTMLElement)) return\n\n const htmlElement = element as HTMLElement\n\n // Make element focusable if it's not naturally focusable\n if (!htmlElement.hasAttribute('tabindex')) {\n htmlElement.setAttribute('tabindex', '0')\n }\n\n if (isSignal(focused) || isComputed(focused)) {\n // Reactive focus management\n createEffect(() => {\n const shouldFocus = focused()\n if (shouldFocus) {\n htmlElement.focus()\n } else {\n htmlElement.blur()\n }\n })\n } else {\n // Static focus management\n if (focused) {\n htmlElement.focus()\n }\n }\n }\n\n /**\n * Setup focusable behavior\n */\n private setupFocusable(\n element: Element,\n options: {\n isFocusable?: boolean\n interactions?: ('activate' | 'edit')[]\n }\n ): void {\n if (!(element instanceof HTMLElement)) return\n\n const htmlElement = element as HTMLElement\n\n if (options.isFocusable === false) {\n htmlElement.setAttribute('tabindex', '-1')\n } else {\n if (!htmlElement.hasAttribute('tabindex')) {\n htmlElement.setAttribute('tabindex', '0')\n }\n }\n\n // Setup interaction behaviors\n if (options.interactions?.includes('activate')) {\n htmlElement.addEventListener('keydown', event => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n htmlElement.click()\n }\n })\n }\n\n if (options.interactions?.includes('edit')) {\n htmlElement.setAttribute('role', 'textbox')\n htmlElement.setAttribute('contenteditable', 'true')\n }\n }\n\n /**\n * Setup continuous hover tracking with coordinates\n */\n private setupContinuousHover(\n element: Element,\n options: {\n coordinateSpace?: 'local' | 'global'\n perform: (location: { x: number; y: number } | null) => void\n }\n ): void {\n const coordinateSpace = options.coordinateSpace ?? 'local'\n\n const handleMouseMove = (event: Event) => {\n const mouseEvent = event as MouseEvent\n let x: number, y: number\n\n if (coordinateSpace === 'local') {\n const rect = element.getBoundingClientRect()\n x = mouseEvent.clientX - rect.left\n y = mouseEvent.clientY - rect.top\n } else {\n x = mouseEvent.clientX\n y = mouseEvent.clientY\n }\n\n options.perform({ x, y })\n }\n\n const handleMouseLeave = () => {\n options.perform(null)\n }\n\n element.addEventListener('mousemove', handleMouseMove as EventListener)\n element.addEventListener('mouseleave', handleMouseLeave as EventListener)\n\n // Store cleanup\n ;(element as any)._continuousHoverCleanup = () => {\n element.removeEventListener('mousemove', handleMouseMove as EventListener)\n element.removeEventListener(\n 'mouseleave',\n handleMouseLeave as EventListener\n )\n }\n }\n\n /**\n * Setup hit testing control\n */\n private setupHitTesting(element: Element, enabled: boolean): void {\n if (element instanceof HTMLElement) {\n element.style.pointerEvents = enabled ? '' : 'none'\n }\n }\n}\n\n/**\n * Animation modifier for transitions and animations\n */\nexport class AnimationModifier extends BaseModifier {\n readonly type = 'animation'\n readonly priority = ModifierPriority.ANIMATION\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const props = this.properties as any\n\n // Transition\n if (props.transition) {\n const t = props.transition\n const property = t.property || 'all'\n const duration = t.duration || 300\n const easing = t.easing || 'ease'\n const delay = t.delay || 0\n\n if (context.element instanceof HTMLElement) {\n context.element.style.transition = `${property} ${duration}ms ${easing} ${delay}ms`\n }\n }\n\n // Animation\n if (props.animation && context.element instanceof HTMLElement) {\n const anim = props.animation\n\n if (anim.keyframes) {\n // Create keyframes\n const keyframeName = `tachui-animation-${context.componentId}-${Date.now()}`\n const keyframeRule = this.createKeyframeRule(\n keyframeName,\n anim.keyframes\n )\n\n // Add keyframes to stylesheet\n this.addKeyframesToStylesheet(keyframeRule)\n\n // Apply animation\n const duration = anim.duration || 1000\n const easing = anim.easing || 'ease'\n const iterations = anim.iterations || 1\n const direction = anim.direction || 'normal'\n\n context.element.style.animation = `${keyframeName} ${duration}ms ${easing} ${iterations} ${direction}`\n }\n }\n\n // Transform\n if (props.transform && context.element instanceof HTMLElement) {\n if (isSignal(props.transform) || isComputed(props.transform)) {\n // Create reactive effect for transform\n createEffect(() => {\n const transformValue = props.transform()\n if (context.element instanceof HTMLElement) {\n context.element.style.transform = transformValue\n }\n })\n } else {\n context.element.style.transform = props.transform\n }\n }\n\n // Rotation Effect (SwiftUI .rotationEffect(angle))\n if (props.rotationEffect && context.element instanceof HTMLElement) {\n const { angle, anchor } = props.rotationEffect\n\n // Convert anchor to CSS transform-origin\n const anchorOrigins: Record<string, string> = {\n center: '50% 50%',\n top: '50% 0%',\n topLeading: '0% 0%',\n topTrailing: '100% 0%',\n bottom: '50% 100%',\n bottomLeading: '0% 100%',\n bottomTrailing: '100% 100%',\n leading: '0% 50%',\n trailing: '100% 50%',\n }\n\n const transformOrigin = anchorOrigins[anchor || 'center'] || '50% 50%'\n\n // Create rotation transform\n const rotationTransform = `rotate(${angle}deg)`\n\n if (isSignal(angle) || isComputed(angle)) {\n // Reactive rotation\n createEffect(() => {\n const currentAngle = typeof angle === 'function' ? angle() : angle\n const currentRotation = `rotate(${currentAngle}deg)`\n\n if (context.element instanceof HTMLElement) {\n context.element.style.transformOrigin = transformOrigin\n\n // Combine with existing transforms if any\n const existingTransform = context.element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('rotate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${currentRotation}`\n : currentRotation\n\n context.element.style.transform = newTransform\n }\n })\n } else {\n // Static rotation\n if (context.element instanceof HTMLElement) {\n context.element.style.transformOrigin = transformOrigin\n\n // Combine with existing transforms if any\n const existingTransform = context.element.style.transform || ''\n const existingTransforms = existingTransform\n .split(' ')\n .filter(t => t && !t.startsWith('rotate('))\n .join(' ')\n\n const newTransform = existingTransforms\n ? `${existingTransforms} ${rotationTransform}`\n : rotationTransform\n\n context.element.style.transform = newTransform\n }\n }\n }\n\n // Overlay modifier (SwiftUI .overlay())\n if (props.overlay && context.element instanceof HTMLElement) {\n this.applyOverlay(context.element, props.overlay, context)\n }\n\n return undefined\n }\n\n private applyOverlay(\n element: HTMLElement,\n overlay: { content: any; alignment?: string },\n _context: ModifierContext\n ): void {\n const { content, alignment = 'center' } = overlay\n\n // Make the element a positioned container\n if (element.style.position === '' || element.style.position === 'static') {\n element.style.position = 'relative'\n }\n\n // Create overlay container\n const overlayContainer = document.createElement('div')\n overlayContainer.style.position = 'absolute'\n overlayContainer.style.pointerEvents = 'none' // Allow clicks to pass through by default\n\n // Apply alignment positioning\n const alignmentStyles = this.getOverlayAlignment(alignment)\n Object.assign(overlayContainer.style, alignmentStyles)\n\n // Render content\n if (typeof content === 'function') {\n // If content is a function, call it to get component\n const contentComponent = content()\n if (contentComponent && typeof contentComponent.render === 'function') {\n const contentNode = contentComponent.render()\n if (contentNode.element) {\n overlayContainer.appendChild(contentNode.element)\n }\n }\n } else if (content && typeof content.render === 'function') {\n // If content is a component instance\n const contentNode = content.render()\n if (contentNode.element) {\n overlayContainer.appendChild(contentNode.element)\n }\n } else if (content instanceof HTMLElement) {\n // If content is already a DOM element\n overlayContainer.appendChild(content)\n }\n\n // Add overlay to the element\n element.appendChild(overlayContainer)\n }\n\n private getOverlayAlignment(alignment: string): Record<string, string> {\n const alignments: Record<string, Record<string, string>> = {\n center: {\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n },\n top: {\n top: '0',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n bottom: {\n bottom: '0',\n left: '50%',\n transform: 'translateX(-50%)',\n },\n leading: {\n top: '50%',\n left: '0',\n transform: 'translateY(-50%)',\n },\n trailing: {\n top: '50%',\n right: '0',\n transform: 'translateY(-50%)',\n },\n topLeading: {\n top: '0',\n left: '0',\n },\n topTrailing: {\n top: '0',\n right: '0',\n },\n bottomLeading: {\n bottom: '0',\n left: '0',\n },\n bottomTrailing: {\n bottom: '0',\n right: '0',\n },\n }\n\n return alignments[alignment] || alignments.center\n }\n\n private createKeyframeRule(\n name: string,\n keyframes: Record<string, Record<string, string>>\n ): string {\n let rule = `@keyframes ${name} {\\n`\n\n for (const [percentage, styles] of Object.entries(keyframes)) {\n rule += ` ${percentage} {\\n`\n for (const [property, value] of Object.entries(styles)) {\n const cssProperty = this.toCSSProperty(property)\n rule += ` ${cssProperty}: ${value};\\n`\n }\n rule += ` }\\n`\n }\n\n rule += '}'\n return rule\n }\n\n private addKeyframesToStylesheet(rule: string): void {\n let stylesheet = document.querySelector(\n '#tachui-animations'\n ) as HTMLStyleElement\n\n if (!stylesheet) {\n stylesheet = document.createElement('style')\n stylesheet.id = 'tachui-animations'\n document.head.appendChild(stylesheet)\n }\n\n stylesheet.appendChild(document.createTextNode(rule))\n }\n}\n\n/**\n * Lifecycle modifier for component lifecycle events\n */\nexport class LifecycleModifier extends BaseModifier {\n readonly type = 'lifecycle'\n readonly priority = ModifierPriority.CUSTOM\n\n private activeAbortController?: AbortController\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const props = this.properties as LifecycleModifierProps\n\n // Clean up any existing tasks on re-application\n if (this.activeAbortController) {\n this.activeAbortController.abort()\n }\n\n // Set up intersection observer for onAppear/onDisappear\n if (props.onAppear || props.onDisappear) {\n this.setupLifecycleObserver(context.element, props)\n }\n\n // Set up async task with cancellation\n if (props.task) {\n this.setupTask(context, props.task)\n }\n\n // Set up refreshable behavior\n if (props.refreshable) {\n this.setupRefreshable(context.element, props.refreshable)\n }\n\n return undefined\n }\n\n private setupLifecycleObserver(\n element: Element,\n props: LifecycleModifierProps\n ): void {\n const observer = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n if (entry.isIntersecting && props.onAppear) {\n // Element has appeared in viewport\n props.onAppear()\n } else if (!entry.isIntersecting && props.onDisappear) {\n // Element has disappeared from viewport\n props.onDisappear()\n }\n })\n },\n {\n threshold: 0.1, // Trigger when 10% of element is visible\n rootMargin: '10px', // Add some margin for better UX\n }\n )\n\n observer.observe(element)\n\n // Store cleanup function\n this.addCleanup(() => {\n observer.disconnect()\n })\n }\n\n private setupTask(\n _context: ModifierContext,\n task: LifecycleModifierProps['task']\n ): void {\n if (!task) return\n\n // Create abort controller for task cancellation\n this.activeAbortController = new AbortController()\n const { signal } = this.activeAbortController\n\n // Execute the task operation\n const executeTask = async () => {\n try {\n if (signal.aborted) return\n\n const result = task.operation()\n\n // Handle both sync and async operations\n if (result instanceof Promise) {\n await result\n }\n } catch (error) {\n if (signal.aborted) return\n console.error('TachUI Task Error:', error)\n }\n }\n\n // Start task execution\n executeTask()\n\n // Add cleanup to cancel task on component unmount\n this.addCleanup(() => {\n if (this.activeAbortController) {\n this.activeAbortController.abort()\n }\n })\n }\n\n private setupRefreshable(\n element: Element,\n refreshable: LifecycleModifierProps['refreshable']\n ): void {\n if (!refreshable) return\n\n let isRefreshing = false\n let pullDistance = 0\n let startY = 0\n\n const threshold = 70 // Pull threshold in pixels\n\n // Create refresh indicator element\n const refreshIndicator = document.createElement('div')\n refreshIndicator.style.cssText = `\n position: absolute;\n top: -50px;\n left: 50%;\n transform: translateX(-50%);\n width: 30px;\n height: 30px;\n border: 2px solid #ccc;\n border-top: 2px solid #007AFF;\n border-radius: 50%;\n animation: tachui-spin 1s linear infinite;\n opacity: 0;\n transition: opacity 0.3s ease;\n z-index: 1000;\n `\n\n // Add spinner animation\n if (!document.querySelector('#tachui-refresh-styles')) {\n const style = document.createElement('style')\n style.id = 'tachui-refresh-styles'\n style.textContent = `\n @keyframes tachui-spin {\n 0% { transform: translateX(-50%) rotate(0deg); }\n 100% { transform: translateX(-50%) rotate(360deg); }\n }\n `\n document.head.appendChild(style)\n }\n\n const container = element.parentElement || element\n if (container instanceof HTMLElement) {\n container.style.position = 'relative'\n container.appendChild(refreshIndicator)\n }\n\n // Touch event handlers\n const handleTouchStart = (e: TouchEvent) => {\n if (isRefreshing) return\n startY = e.touches[0].clientY\n }\n\n const handleTouchMove = (e: TouchEvent) => {\n if (isRefreshing) return\n\n const currentY = e.touches[0].clientY\n pullDistance = Math.max(0, currentY - startY)\n\n // Show indicator when pulling down\n if (pullDistance > 20) {\n const opacity = Math.min(1, pullDistance / threshold)\n refreshIndicator.style.opacity = String(opacity)\n }\n\n // Prevent default scroll behavior when pulling down at top\n if (pullDistance > 0 && element.scrollTop === 0) {\n e.preventDefault()\n }\n }\n\n const handleTouchEnd = async () => {\n if (isRefreshing) return\n\n if (pullDistance > threshold) {\n // Trigger refresh\n isRefreshing = true\n refreshIndicator.style.opacity = '1'\n\n try {\n await refreshable.onRefresh()\n } catch (error) {\n console.error('Refresh error:', error)\n } finally {\n isRefreshing = false\n refreshIndicator.style.opacity = '0'\n pullDistance = 0\n }\n } else {\n // Reset indicator\n refreshIndicator.style.opacity = '0'\n pullDistance = 0\n }\n }\n\n // Add touch event listeners\n element.addEventListener('touchstart', handleTouchStart as EventListener, {\n passive: true,\n })\n element.addEventListener('touchmove', handleTouchMove as EventListener, {\n passive: false,\n })\n element.addEventListener('touchend', handleTouchEnd as EventListener, {\n passive: true,\n })\n\n // Store cleanup function\n this.addCleanup(() => {\n element.removeEventListener(\n 'touchstart',\n handleTouchStart as EventListener\n )\n element.removeEventListener('touchmove', handleTouchMove as EventListener)\n element.removeEventListener('touchend', handleTouchEnd as EventListener)\n if (refreshIndicator.parentElement) {\n refreshIndicator.parentElement.removeChild(refreshIndicator)\n }\n })\n }\n\n // Cleanup helpers\n private cleanupFunctions: (() => void)[] = []\n\n protected addCleanup(fn: () => void): void {\n this.cleanupFunctions.push(fn)\n }\n\n public cleanup(): void {\n this.cleanupFunctions.forEach(fn => fn())\n this.cleanupFunctions = []\n }\n}\n"],"names":["BaseModifier","properties","props","context","resolved","key","value","isSignal","isComputed","element","property","cssProperty","createEffect","currentValue","cssValue","actualValue","styles","styleTarget","classes","componentId","modifiers","LayoutModifier","__publicField","ModifierPriority","node","styleContext","offset","x","y","currentX","currentY","offsetX","offsetY","translateValue","existingTransforms","t","newTransform","aspectRatio","ratio","contentMode","currentRatio","scaleEffect","anchor","scaleX","scaleY","scaleValue","position","zIndex","currentZIndex","_context","frame","infinityResult","shouldExpandForInfinity","dimensionToCSS","isInfinity","p","m","priority","horizontal","vertical","AppearanceModifier","themeSignal","getThemeSignal","resolvedColor","font","border","shadow","radius","color","shape","parameters","radiusX","radiusY","inset","points","filters","component","InteractionModifier","_node","startX","startY","e","touch","deltaX","deltaY","event","target","options","minimumDuration","maximumDistance","timeoutId","startPoint","isPressing","cleanup","handlePointerDown","pointerEvent","handlePointerMove","handlePointerUp","handlePointerCancel","shortcut","handleKeyDown","requiredModifiers","actualModifiers","keyMatches","modifiersMatch","mod","required","focused","htmlElement","coordinateSpace","handleMouseMove","mouseEvent","rect","handleMouseLeave","enabled","AnimationModifier","duration","easing","delay","anim","keyframeName","keyframeRule","iterations","direction","transformValue","angle","transformOrigin","rotationTransform","currentRotation","overlay","content","alignment","overlayContainer","alignmentStyles","contentComponent","contentNode","alignments","name","keyframes","rule","percentage","stylesheet","LifecycleModifier","observer","entries","entry","task","signal","result","error","refreshable","isRefreshing","pullDistance","threshold","refreshIndicator","style","container","handleTouchStart","handleTouchMove","opacity","handleTouchEnd","fn"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"margin.js","sources":["../../src/basic/margin.ts"],"sourcesContent":["/**\n * Margin Modifier - Best-in-class external spacing around elements\n *\n * Comprehensive interface for element margins with full SwiftUI compatibility,\n * CSS-in-JS support, reactive values, design system presets, and RTL awareness.\n */\n\n// Comprehensive CSS-compatible margin values including modern CSS units\nexport type MarginValue =\n | number\n | string\n | `${number}px`\n | `${number}rem`\n | `${number}em`\n | `${number}%`\n | `${number}vw`\n | `${number}vh`\n | `${number}vmin`\n | `${number}vmax`\n | 'auto'\n\n// Advanced type-safe options with comprehensive conflict prevention and SwiftUI compatibility\nexport type MarginOptions =\n | {\n all: MarginValue\n vertical?: never\n horizontal?: never\n top?: never\n right?: never\n bottom?: never\n left?: never\n leading?: never\n trailing?: never\n }\n | {\n all?: never\n vertical: MarginValue\n horizontal: MarginValue\n top?: never\n right?: never\n bottom?: never\n left?: never\n leading?: never\n trailing?: never\n }\n | {\n all?: never\n vertical?: MarginValue\n horizontal?: MarginValue\n top?: MarginValue\n right?: MarginValue\n bottom?: MarginValue\n left?: MarginValue\n leading?: never\n trailing?: never\n }\n | {\n all?: never\n vertical?: MarginValue\n horizontal?: MarginValue\n top?: MarginValue\n leading?: MarginValue\n trailing?: MarginValue\n bottom?: MarginValue\n right?: never\n left?: never\n }\n\nimport type { DOMNode } from '@tachui/core/runtime/types'\nimport { BaseModifier } from './base'\nimport type {\n ModifierContext,\n ReactiveModifierProps,\n} from '@tachui/core/modifiers/types'\nimport { isSignal, isComputed } from '@tachui/core/reactive'\n\nexport type ReactiveMarginOptions = ReactiveModifierProps<MarginOptions>\n\nexport class MarginModifier extends BaseModifier<MarginOptions> {\n readonly type = 'margin'\n readonly priority = 50 // Optimized priority for external spacing (after padding at 45)\n\n constructor(options: ReactiveMarginOptions) {\n // Enhanced reactive value handling\n super(options as unknown as MarginOptions)\n }\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const styles = this.computeMarginStyles(this.properties)\n this.applyStyles(context.element, styles)\n\n return undefined\n }\n\n private computeMarginStyles(props: MarginOptions) {\n const styles: Record<string, any> = {}\n\n // Enhanced value formatter with comprehensive CSS unit support\n // Now handles reactive signals properly by passing them through unchanged\n const formatValue = (value: MarginValue): any => {\n // Pass reactive signals through directly to applyStyles\n if (isSignal(value) || isComputed(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return `${value}px`\n }\n if (value === 'auto') return value\n if (typeof value === 'string') {\n // Validate and normalize CSS values\n const cssValueRegex = /^-?\\d*\\.?\\d+(px|rem|em|%|vw|vh|vmin|vmax)$/\n return cssValueRegex.test(value) ? value : `${value}px`\n }\n return String(value)\n }\n\n // Priority-based application with enhanced logic\n if ('all' in props && props.all !== undefined) {\n // All sides - highest priority, most efficient CSS\n styles.margin = formatValue(props.all)\n } else {\n // Handle shorthand properties with optimal CSS generation\n if ('vertical' in props && props.vertical !== undefined) {\n const value = formatValue(props.vertical)\n styles.marginTop = value\n styles.marginBottom = value\n }\n if ('horizontal' in props && props.horizontal !== undefined) {\n const value = formatValue(props.horizontal)\n styles.marginLeft = value\n styles.marginRight = value\n }\n\n // Individual sides override shorthand (maintain specificity)\n if ('top' in props && props.top !== undefined) {\n styles.marginTop = formatValue(props.top)\n }\n if ('right' in props && props.right !== undefined) {\n styles.marginRight = formatValue(props.right)\n }\n if ('bottom' in props && props.bottom !== undefined) {\n styles.marginBottom = formatValue(props.bottom)\n }\n if ('left' in props && props.left !== undefined) {\n styles.marginLeft = formatValue(props.left)\n }\n\n // SwiftUI-style leading/trailing with RTL awareness\n // TODO: Add RTL detection for proper leading/trailing mapping\n if ('leading' in props && props.leading !== undefined) {\n styles.marginLeft = formatValue(props.leading) // LTR assumption\n }\n if ('trailing' in props && props.trailing !== undefined) {\n styles.marginRight = formatValue(props.trailing) // LTR assumption\n }\n }\n\n return styles\n }\n}\n\n/**\n * Create a margin modifier with comprehensive flexibility\n *\n * Best-in-class implementation with full type safety, SwiftUI compatibility,\n * and modern CSS unit support.\n *\n * @example\n * ```typescript\n * // All sides equal\n * .margin({ all: 16 })\n * .margin(16) // Shorthand\n * .margin('auto') // Center horizontally\n *\n * // Symmetric spacing\n * .margin({ vertical: 12, horizontal: 8 })\n * .margin({ vertical: 30, horizontal: 'auto' })\n *\n * // Individual sides with modern CSS units\n * .margin({ top: '1rem', bottom: 16, left: '2vw', right: 12 })\n *\n * // SwiftUI-style leading/trailing\n * .margin({ leading: 16, trailing: 8, vertical: 12 })\n *\n * // Mixed approach with overrides\n * .margin({ horizontal: 16, top: 8, bottom: 24 })\n *\n * // Modern CSS units\n * .margin({ all: '1rem' })\n * .margin({ vertical: '2vh', horizontal: 'auto' })\n * ```\n */\nexport function margin(options: ReactiveMarginOptions): MarginModifier\nexport function margin(all: MarginValue): MarginModifier\nexport function margin(\n optionsOrAll: ReactiveMarginOptions | MarginValue\n): MarginModifier {\n if (typeof optionsOrAll === 'number' || typeof optionsOrAll === 'string') {\n return new MarginModifier({ all: optionsOrAll })\n }\n return new MarginModifier(optionsOrAll)\n}\n\n/**\n * Convenience function for top margin only\n *\n * @example\n * ```typescript\n * .marginTop(16)\n * .marginTop('1rem')\n * .marginTop('2vh')\n * ```\n */\nexport function marginTop(value: MarginValue): MarginModifier {\n return new MarginModifier({ top: value })\n}\n\n/**\n * Convenience function for bottom margin only\n *\n * @example\n * ```typescript\n * .marginBottom(24)\n * .marginBottom('2rem')\n * ```\n */\nexport function marginBottom(value: MarginValue): MarginModifier {\n return new MarginModifier({ bottom: value })\n}\n\n/**\n * Convenience function for left margin only\n *\n * @example\n * ```typescript\n * .marginLeft(12)\n * .marginLeft('1rem')\n * ```\n */\nexport function marginLeft(value: MarginValue): MarginModifier {\n return new MarginModifier({ left: value })\n}\n\n/**\n * Convenience function for right margin only\n *\n * @example\n * ```typescript\n * .marginRight(12)\n * .marginRight('1rem')\n * ```\n */\nexport function marginRight(value: MarginValue): MarginModifier {\n return new MarginModifier({ right: value })\n}\n\n/**\n * SwiftUI-style leading margin (left in LTR, right in RTL)\n *\n * @example\n * ```typescript\n * .marginLeading(16)\n * .marginLeading('1rem')\n * ```\n */\nexport function marginLeading(value: MarginValue): MarginModifier {\n return new MarginModifier({ leading: value })\n}\n\n/**\n * SwiftUI-style trailing margin (right in LTR, left in RTL)\n *\n * @example\n * ```typescript\n * .marginTrailing(8)\n * .marginTrailing('0.5rem')\n * ```\n */\nexport function marginTrailing(value: MarginValue): MarginModifier {\n return new MarginModifier({ trailing: value })\n}\n\n/**\n * Convenience function for left and right margin\n *\n * @example\n * ```typescript\n * .marginHorizontal(20)\n * .marginHorizontal('2rem')\n * .marginHorizontal('auto') // Center horizontally\n * .marginHorizontal('5vw')\n * ```\n */\nexport function marginHorizontal(value: MarginValue): MarginModifier {\n return new MarginModifier({ horizontal: value })\n}\n\n/**\n * Convenience function for top and bottom margin\n *\n * @example\n * ```typescript\n * .marginVertical(16)\n * .marginVertical('1rem')\n * .marginVertical('3vh')\n * ```\n */\nexport function marginVertical(value: MarginValue): MarginModifier {\n return new MarginModifier({ vertical: value })\n}\n\n/**\n * Design system margin presets for consistent spacing\n *\n * Based on modern design system principles with t-shirt sizing\n * and semantic naming for common UI patterns.\n */\nexport const marginPresets = {\n /**\n * Extra small margin (4px) - For tight spacing\n */\n xs: () => margin(4),\n\n /**\n * Small margin (8px) - For compact components\n */\n sm: () => margin(8),\n\n /**\n * Medium margin (12px) - Default comfortable spacing\n */\n md: () => margin(12),\n\n /**\n * Large margin (16px) - For prominent separation\n */\n lg: () => margin(16),\n\n /**\n * Extra large margin (24px) - For emphasis\n */\n xl: () => margin(24),\n\n /**\n * Extra extra large margin (32px) - For major sections\n */\n xxl: () => margin(32),\n\n /**\n * Huge margin (48px) - For hero sections\n */\n xxxl: () => margin(48),\n\n // Semantic presets for common UI patterns\n\n /**\n * Component separation (vertical: 16, horizontal: 0)\n * For spacing between stacked components\n */\n component: () => margin({ vertical: 16, horizontal: 0 }),\n\n /**\n * Section separation (vertical: 24, horizontal: 0)\n * For major content sections\n */\n section: () => margin({ vertical: 24, horizontal: 0 }),\n\n /**\n * Page margin (horizontal: auto)\n * For centering page content\n */\n page: () => margin({ horizontal: 'auto' }),\n\n /**\n * Card margin (all: 16)\n * Standard margin around card components\n */\n card: () => margin(16),\n\n /**\n * Compact card margin (all: 8)\n */\n cardSm: () => margin(8),\n\n /**\n * Spacious card margin (all: 24)\n */\n cardLg: () => margin(24),\n\n /**\n * Button margin (horizontal: 8, vertical: 4)\n * For spacing between inline buttons\n */\n button: () => margin({ horizontal: 8, vertical: 4 }),\n\n /**\n * List item margin (vertical: 8, horizontal: 0)\n * For spacing between list items\n */\n listItem: () => margin({ vertical: 8, horizontal: 0 }),\n\n /**\n * Form field margin (vertical: 12, horizontal: 0)\n * For spacing between form fields\n */\n field: () => margin({ vertical: 12, horizontal: 0 }),\n\n /**\n * Zero margin utility\n * For removing default margins\n */\n none: () => margin(0),\n\n /**\n * Auto margin utility\n * For centering elements\n */\n auto: () => margin('auto'),\n} as const\n\n// Types are exported above - avoiding duplicate exports\n"],"names":["MarginModifier","BaseModifier","options","__publicField","_node","context","styles","props","formatValue","value","isSignal","isComputed","margin","optionsOrAll","marginTop","marginBottom","marginLeft","marginRight","marginLeading","marginTrailing","marginHorizontal","marginVertical","marginPresets"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"padding.js","sources":["../../src/basic/padding.ts"],"sourcesContent":["/**\n * Padding Modifier - Best-in-class internal spacing within elements\n *\n * Comprehensive interface for element padding with full SwiftUI compatibility,\n * CSS-in-JS support, reactive values, design system presets, and RTL awareness.\n */\n\nimport type { DOMNode } from '@tachui/core/runtime/types'\nimport { BaseModifier } from './base'\nimport type {\n ModifierContext,\n ReactiveModifierProps,\n} from '@tachui/core/modifiers/types'\nimport { isSignal, isComputed } from '@tachui/core/reactive'\n\n// Comprehensive CSS-compatible padding values including modern CSS units\nexport type PaddingValue =\n | number\n | string\n | `${number}px`\n | `${number}rem`\n | `${number}em`\n | `${number}%`\n | `${number}vw`\n | `${number}vh`\n | `${number}vmin`\n | `${number}vmax`\n | 'auto'\n\n// Advanced type-safe options with comprehensive conflict prevention and SwiftUI compatibility\nexport type PaddingOptions =\n | {\n all: PaddingValue\n vertical?: never\n horizontal?: never\n top?: never\n right?: never\n bottom?: never\n left?: never\n leading?: never\n trailing?: never\n }\n | {\n all?: never\n vertical: PaddingValue\n horizontal: PaddingValue\n top?: never\n right?: never\n bottom?: never\n left?: never\n leading?: never\n trailing?: never\n }\n | {\n all?: never\n vertical?: PaddingValue\n horizontal?: PaddingValue\n top?: PaddingValue\n right?: PaddingValue\n bottom?: PaddingValue\n left?: PaddingValue\n leading?: never\n trailing?: never\n }\n | {\n all?: never\n vertical?: PaddingValue\n horizontal?: PaddingValue\n top?: PaddingValue\n leading?: PaddingValue\n trailing?: PaddingValue\n bottom?: PaddingValue\n right?: never\n left?: never\n }\n\nexport type ReactivePaddingOptions = ReactiveModifierProps<PaddingOptions>\n\nexport class PaddingModifier extends BaseModifier<PaddingOptions> {\n readonly type = 'padding'\n readonly priority = 45 // Optimized priority for internal spacing (before margin at 50)\n\n constructor(options: ReactivePaddingOptions) {\n // Enhanced reactive value handling\n super(options as unknown as PaddingOptions)\n }\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const styles = this.computePaddingStyles(this.properties)\n this.applyStyles(context.element, styles)\n\n return undefined\n }\n\n private computePaddingStyles(props: PaddingOptions) {\n const styles: Record<string, any> = {}\n\n // Enhanced value formatter with comprehensive CSS unit support\n // Now handles reactive signals properly by passing them through unchanged\n const formatValue = (value: PaddingValue): any => {\n // Pass reactive signals through directly to applyStyles\n if (isSignal(value) || isComputed(value)) {\n return value\n }\n\n if (typeof value === 'number') {\n return `${value}px`\n }\n if (value === 'auto') return value\n if (typeof value === 'string') {\n // Validate and normalize CSS values\n const cssValueRegex = /^-?\\d*\\.?\\d+(px|rem|em|%|vw|vh|vmin|vmax)$/\n return cssValueRegex.test(value) ? value : `${value}px`\n }\n return String(value)\n }\n\n // Priority-based application with enhanced logic\n if ('all' in props && props.all !== undefined) {\n // All sides - highest priority, most efficient CSS\n styles.padding = formatValue(props.all)\n } else {\n // Handle shorthand properties with optimal CSS generation\n if ('vertical' in props && props.vertical !== undefined) {\n const value = formatValue(props.vertical)\n styles.paddingTop = value\n styles.paddingBottom = value\n }\n if ('horizontal' in props && props.horizontal !== undefined) {\n const value = formatValue(props.horizontal)\n styles.paddingLeft = value\n styles.paddingRight = value\n }\n\n // Individual sides override shorthand (maintain specificity)\n if ('top' in props && props.top !== undefined) {\n styles.paddingTop = formatValue(props.top)\n }\n if ('right' in props && props.right !== undefined) {\n styles.paddingRight = formatValue(props.right)\n }\n if ('bottom' in props && props.bottom !== undefined) {\n styles.paddingBottom = formatValue(props.bottom)\n }\n if ('left' in props && props.left !== undefined) {\n styles.paddingLeft = formatValue(props.left)\n }\n\n // SwiftUI-style leading/trailing with RTL awareness\n // TODO: Add RTL detection for proper leading/trailing mapping\n if ('leading' in props && props.leading !== undefined) {\n styles.paddingLeft = formatValue(props.leading) // LTR assumption\n }\n if ('trailing' in props && props.trailing !== undefined) {\n styles.paddingRight = formatValue(props.trailing) // LTR assumption\n }\n }\n\n return styles\n }\n}\n\n/**\n * Create a padding modifier with comprehensive flexibility\n *\n * Best-in-class implementation with full type safety, SwiftUI compatibility,\n * and modern CSS unit support.\n *\n * @example\n * ```typescript\n * // All sides equal\n * .padding({ all: 16 })\n * .padding(16) // Shorthand\n *\n * // Symmetric spacing\n * .padding({ vertical: 12, horizontal: 8 })\n *\n * // Individual sides with modern CSS units\n * .padding({ top: '1rem', bottom: 16, left: '2vw', right: 12 })\n *\n * // SwiftUI-style leading/trailing\n * .padding({ leading: 16, trailing: 8, vertical: 12 })\n *\n * // Mixed approach with overrides\n * .padding({ horizontal: 16, top: 8, bottom: 24 })\n *\n * // Modern CSS units\n * .padding({ all: '1rem' })\n * .padding({ vertical: '2vh', horizontal: '10vw' })\n * ```\n */\nexport function padding(options: ReactivePaddingOptions): PaddingModifier\nexport function padding(all: PaddingValue): PaddingModifier\nexport function padding(\n optionsOrAll: ReactivePaddingOptions | PaddingValue\n): PaddingModifier {\n if (typeof optionsOrAll === 'number' || typeof optionsOrAll === 'string') {\n return new PaddingModifier({ all: optionsOrAll })\n }\n return new PaddingModifier(optionsOrAll)\n}\n\n/**\n * Convenience function for top padding only\n *\n * @example\n * ```typescript\n * .paddingTop(16)\n * .paddingTop('1rem')\n * .paddingTop('2vh')\n * ```\n */\nexport function paddingTop(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ top: value })\n}\n\n/**\n * Convenience function for bottom padding only\n *\n * @example\n * ```typescript\n * .paddingBottom(24)\n * .paddingBottom('2rem')\n * ```\n */\nexport function paddingBottom(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ bottom: value })\n}\n\n/**\n * Convenience function for left padding only\n *\n * @example\n * ```typescript\n * .paddingLeft(12)\n * .paddingLeft('1rem')\n * ```\n */\nexport function paddingLeft(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ left: value })\n}\n\n/**\n * Convenience function for right padding only\n *\n * @example\n * ```typescript\n * .paddingRight(12)\n * .paddingRight('1rem')\n * ```\n */\nexport function paddingRight(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ right: value })\n}\n\n/**\n * SwiftUI-style leading padding (left in LTR, right in RTL)\n *\n * @example\n * ```typescript\n * .paddingLeading(16)\n * .paddingLeading('1rem')\n * ```\n */\nexport function paddingLeading(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ leading: value })\n}\n\n/**\n * SwiftUI-style trailing padding (right in LTR, left in RTL)\n *\n * @example\n * ```typescript\n * .paddingTrailing(8)\n * .paddingTrailing('0.5rem')\n * ```\n */\nexport function paddingTrailing(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ trailing: value })\n}\n\n/**\n * Convenience function for left and right padding\n *\n * @example\n * ```typescript\n * .paddingHorizontal(20)\n * .paddingHorizontal('2rem')\n * .paddingHorizontal('5vw')\n * ```\n */\nexport function paddingHorizontal(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ horizontal: value })\n}\n\n/**\n * Convenience function for top and bottom padding\n *\n * @example\n * ```typescript\n * .paddingVertical(16)\n * .paddingVertical('1rem')\n * .paddingVertical('3vh')\n * ```\n */\nexport function paddingVertical(value: PaddingValue): PaddingModifier {\n return new PaddingModifier({ vertical: value })\n}\n\n/**\n * Design system padding presets for consistent spacing\n *\n * Based on modern design system principles with t-shirt sizing\n * and semantic naming for common UI patterns.\n */\nexport const paddingPresets = {\n /**\n * Extra small padding (4px) - For tight spacing\n */\n xs: () => padding(4),\n\n /**\n * Small padding (8px) - For compact components\n */\n sm: () => padding(8),\n\n /**\n * Medium padding (12px) - Default comfortable spacing\n */\n md: () => padding(12),\n\n /**\n * Large padding (16px) - For prominent components\n */\n lg: () => padding(16),\n\n /**\n * Extra large padding (24px) - For emphasis\n */\n xl: () => padding(24),\n\n /**\n * Extra extra large padding (32px) - For major sections\n */\n xxl: () => padding(32),\n\n /**\n * Huge padding (48px) - For hero sections\n */\n xxxl: () => padding(48),\n\n // Semantic presets for common UI patterns\n\n /**\n * Button padding preset (horizontal: 16, vertical: 8)\n * Optimized for interactive elements\n */\n button: () => padding({ horizontal: 16, vertical: 8 }),\n\n /**\n * Small button padding (horizontal: 12, vertical: 6)\n */\n buttonSm: () => padding({ horizontal: 12, vertical: 6 }),\n\n /**\n * Large button padding (horizontal: 24, vertical: 12)\n */\n buttonLg: () => padding({ horizontal: 24, vertical: 12 }),\n\n /**\n * Card padding preset (all: 16)\n * Standard for card-like containers\n */\n card: () => padding(16),\n\n /**\n * Compact card padding (all: 12)\n */\n cardSm: () => padding(12),\n\n /**\n * Spacious card padding (all: 24)\n */\n cardLg: () => padding(24),\n\n /**\n * Section padding preset (horizontal: 20, vertical: 12)\n * For content sections and layout blocks\n */\n section: () => padding({ horizontal: 20, vertical: 12 }),\n\n /**\n * Page padding preset (horizontal: 24, vertical: 16)\n * For top-level page containers\n */\n page: () => padding({ horizontal: 24, vertical: 16 }),\n\n /**\n * Form field padding (horizontal: 12, vertical: 8)\n */\n field: () => padding({ horizontal: 12, vertical: 8 }),\n\n /**\n * Navigation item padding (horizontal: 16, vertical: 8)\n */\n nav: () => padding({ horizontal: 16, vertical: 8 }),\n\n /**\n * List item padding (horizontal: 16, vertical: 12)\n */\n listItem: () => padding({ horizontal: 16, vertical: 12 }),\n} as const\n\n// Types are exported above - avoiding duplicate exports\n"],"names":["PaddingModifier","BaseModifier","options","__publicField","_node","context","styles","props","formatValue","value","isSignal","isComputed","padding","optionsOrAll","paddingTop","paddingBottom","paddingLeft","paddingRight","paddingLeading","paddingTrailing","paddingHorizontal","paddingVertical","paddingPresets"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"size.js","sources":["../../src/basic/size.ts"],"sourcesContent":["/**\n * Size Modifier - width, height, min/max dimensions\n *\n * Provides a unified interface for setting element dimensions\n * with support for SwiftUI-style infinity constants.\n */\n\nimport type { DOMNode } from '@tachui/core/runtime/types'\nimport type { Dimension } from '@tachui/core/constants/layout'\nimport {\n dimensionToCSS,\n isInfinity,\n shouldExpandForInfinity,\n} from '@tachui/core/constants/layout'\nimport { BaseModifier } from './base'\nimport type {\n ModifierContext,\n ReactiveModifierProps,\n} from '@tachui/core/modifiers/types'\n\nexport interface SizeOptions {\n width?: Dimension\n height?: Dimension\n minWidth?: Dimension\n maxWidth?: Dimension\n minHeight?: Dimension\n maxHeight?: Dimension\n}\n\nexport type ReactiveSizeOptions = ReactiveModifierProps<SizeOptions>\n\nexport class SizeModifier extends BaseModifier<SizeOptions> {\n readonly type = 'size'\n readonly priority = 80 // Priority 80 for layout\n\n constructor(options: ReactiveSizeOptions) {\n // Preserve reactive values; BaseModifier.applyStyles will create effects\n super(options as unknown as SizeOptions)\n }\n\n apply(_node: DOMNode, context: ModifierContext): DOMNode | undefined {\n if (!context.element) return\n\n const styles = this.computeSizeStyles(this.properties)\n this.applyStyles(context.element, styles)\n\n return undefined\n }\n\n private computeSizeStyles(props: SizeOptions) {\n const styles: Record<string, any> = {}\n\n // Check for infinity constraints and apply appropriate flex/size styles\n const infinityResult = shouldExpandForInfinity(props)\n Object.assign(styles, infinityResult.cssProps)\n\n // Convert dimensions to CSS, handling infinity appropriately\n if (props.width !== undefined) {\n const cssValue = dimensionToCSS(props.width)\n if (cssValue !== undefined && !isInfinity(props.width)) {\n styles.width = cssValue\n }\n }\n\n if (props.height !== undefined) {\n const cssValue = dimensionToCSS(props.height)\n if (cssValue !== undefined && !isInfinity(props.height)) {\n styles.height = cssValue\n }\n }\n\n if (props.minWidth !== undefined) {\n const cssValue = dimensionToCSS(props.minWidth)\n if (cssValue !== undefined) {\n styles.minWidth = cssValue\n }\n }\n\n if (props.maxWidth !== undefined && !isInfinity(props.maxWidth)) {\n const cssValue = dimensionToCSS(props.maxWidth)\n if (cssValue !== undefined) {\n styles.maxWidth = cssValue\n }\n } else if (isInfinity(props.maxWidth)) {\n // Remove maxWidth constraint for infinity\n styles.maxWidth = 'none'\n }\n\n if (props.minHeight !== undefined) {\n const cssValue = dimensionToCSS(props.minHeight)\n if (cssValue !== undefined) {\n styles.minHeight = cssValue\n }\n }\n\n if (props.maxHeight !== undefined && !isInfinity(props.maxHeight)) {\n const cssValue = dimensionToCSS(props.maxHeight)\n if (cssValue !== undefined) {\n styles.maxHeight = cssValue\n }\n } else if (isInfinity(props.maxHeight)) {\n // Remove maxHeight constraint for infinity\n styles.maxHeight = 'none'\n }\n\n return styles\n }\n}\n\n/**\n * Create a size modifier with multiple dimension properties\n * Now supports SwiftUI-style infinity for responsive layouts\n *\n * @example\n * ```typescript\n * // Set both width and height\n * .size({ width: 200, height: 100 })\n *\n * // Set responsive width with constraints\n * .size({ width: '100%', maxWidth: 800, minWidth: 320 })\n *\n * // SwiftUI-style infinity support\n * .size({ width: infinity, height: 200 })\n * .size({ maxWidth: infinity, maxHeight: infinity })\n * ```\n */\nexport function size(options: ReactiveSizeOptions): SizeModifier {\n return new SizeModifier(options)\n}\n\n/**\n * Convenience function for setting width only\n * Supports infinity for fill-available behavior\n *\n * @example\n * ```typescript\n * .width('100%')\n * .width(280)\n * .width(infinity) // Fill available space\n * ```\n */\nexport function width(value: Dimension): SizeModifier {\n return new SizeModifier({ width: value })\n}\n\n/**\n * Convenience function for setting height only\n * Supports infinity for fill-available behavior\n *\n * @example\n * ```typescript\n * .height('100vh')\n * .height(64)\n * .height(infinity) // Fill available space\n * ```\n */\nexport function height(value: Dimension): SizeModifier {\n return new SizeModifier({ height: value })\n}\n\n/**\n * Convenience function for setting max-width only\n * Supports infinity to remove width constraints\n *\n * @example\n * ```typescript\n * .maxWidth(800)\n * .maxWidth('100%')\n * .maxWidth(infinity) // Remove width constraints\n * ```\n */\nexport function maxWidth(value: Dimension): SizeModifier {\n return new SizeModifier({ maxWidth: value })\n}\n\n/**\n * Convenience function for setting min-width only\n *\n * @example\n * ```typescript\n * .minWidth(320)\n * .minWidth('50%')\n * ```\n */\nexport function minWidth(value: Dimension): SizeModifier {\n return new SizeModifier({ minWidth: value })\n}\n\n/**\n * Convenience function for setting max-height only\n * Supports infinity to remove height constraints\n *\n * @example\n * ```typescript\n * .maxHeight(600)\n * .maxHeight('80vh')\n * .maxHeight(infinity) // Remove height constraints\n * ```\n */\nexport function maxHeight(value: Dimension): SizeModifier {\n return new SizeModifier({ maxHeight: value })\n}\n\n/**\n * Convenience function for setting min-height only\n *\n * @example\n * ```typescript\n * .minHeight(200)\n * .minHeight('30vh')\n * ```\n */\nexport function minHeight(value: Dimension): SizeModifier {\n return new SizeModifier({ minHeight: value })\n}\n"],"names":["SizeModifier","BaseModifier","options","__publicField","_node","context","styles","props","infinityResult","shouldExpandForInfinity","cssValue","dimensionToCSS","isInfinity","size","width","value","height","maxWidth","minWidth","maxHeight","minHeight"],"mappings":";;;;;AA+BO,MAAMA,UAAqBC,EAA0B;AAAA;AAAA,EAI1D,YAAYC,GAA8B;AAExC,UAAMA,CAAiC;AALhC,IAAAC,EAAA,cAAO;AACP,IAAAA,EAAA,kBAAW;AAAA,EAKpB;AAAA,EAEA,MAAMC,GAAgBC,GAA+C;AACnE,QAAI,CAACA,EAAQ,QAAS;AAEtB,UAAMC,IAAS,KAAK,kBAAkB,KAAK,UAAU;AACrD,SAAK,YAAYD,EAAQ,SAASC,CAAM;AAAA,EAG1C;AAAA,EAEQ,kBAAkBC,GAAoB;AAC5C,UAAMD,IAA8B,CAAA,GAG9BE,IAAiBC,EAAwBF,CAAK;AAIpD,QAHA,OAAO,OAAOD,GAAQE,EAAe,QAAQ,GAGzCD,EAAM,UAAU,QAAW;AAC7B,YAAMG,IAAWC,EAAeJ,EAAM,KAAK;AAC3C,MAAIG,MAAa,UAAa,CAACE,EAAWL,EAAM,KAAK,MACnDD,EAAO,QAAQI;AAAA,IAEnB;AAEA,QAAIH,EAAM,WAAW,QAAW;AAC9B,YAAMG,IAAWC,EAAeJ,EAAM,MAAM;AAC5C,MAAIG,MAAa,UAAa,CAACE,EAAWL,EAAM,MAAM,MACpDD,EAAO,SAASI;AAAA,IAEpB;AAEA,QAAIH,EAAM,aAAa,QAAW;AAChC,YAAMG,IAAWC,EAAeJ,EAAM,QAAQ;AAC9C,MAAIG,MAAa,WACfJ,EAAO,WAAWI;AAAA,IAEtB;AAEA,QAAIH,EAAM,aAAa,UAAa,CAACK,EAAWL,EAAM,QAAQ,GAAG;AAC/D,YAAMG,IAAWC,EAAeJ,EAAM,QAAQ;AAC9C,MAAIG,MAAa,WACfJ,EAAO,WAAWI;AAAA,IAEtB,MAAA,CAAWE,EAAWL,EAAM,QAAQ,MAElCD,EAAO,WAAW;AAGpB,QAAIC,EAAM,cAAc,QAAW;AACjC,YAAMG,IAAWC,EAAeJ,EAAM,SAAS;AAC/C,MAAIG,MAAa,WACfJ,EAAO,YAAYI;AAAA,IAEvB;AAEA,QAAIH,EAAM,cAAc,UAAa,CAACK,EAAWL,EAAM,SAAS,GAAG;AACjE,YAAMG,IAAWC,EAAeJ,EAAM,SAAS;AAC/C,MAAIG,MAAa,WACfJ,EAAO,YAAYI;AAAA,IAEvB,MAAA,CAAWE,EAAWL,EAAM,SAAS,MAEnCD,EAAO,YAAY;AAGrB,WAAOA;AAAA,EACT;AACF;AAmBO,SAASO,EAAKX,GAA4C;AAC/D,SAAO,IAAIF,EAAaE,CAAO;AACjC;AAaO,SAASY,EAAMC,GAAgC;AACpD,SAAO,IAAIf,EAAa,EAAE,OAAOe,GAAO;AAC1C;AAaO,SAASC,EAAOD,GAAgC;AACrD,SAAO,IAAIf,EAAa,EAAE,QAAQe,GAAO;AAC3C;AAaO,SAASE,EAASF,GAAgC;AACvD,SAAO,IAAIf,EAAa,EAAE,UAAUe,GAAO;AAC7C;AAWO,SAASG,EAASH,GAAgC;AACvD,SAAO,IAAIf,EAAa,EAAE,UAAUe,GAAO;AAC7C;AAaO,SAASI,EAAUJ,GAAgC;AACxD,SAAO,IAAIf,EAAa,EAAE,WAAWe,GAAO;AAC9C;AAWO,SAASK,EAAUL,GAAgC;AACxD,SAAO,IAAIf,EAAa,EAAE,WAAWe,GAAO;AAC9C;"}