web-mojo 2.1.1043 → 2.1.1087

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 (119) hide show
  1. package/README.md +19 -16
  2. package/dist/admin.cjs.js +1 -1
  3. package/dist/admin.cjs.js.map +1 -1
  4. package/dist/admin.es.js +16 -14
  5. package/dist/admin.es.js.map +1 -1
  6. package/dist/auth.cjs.js +1 -1
  7. package/dist/auth.cjs.js.map +1 -1
  8. package/dist/auth.css +305 -266
  9. package/dist/auth.es.js +537 -2175
  10. package/dist/auth.es.js.map +1 -1
  11. package/dist/charts.cjs.js +1 -1
  12. package/dist/charts.cjs.js.map +1 -1
  13. package/dist/charts.css +319 -0
  14. package/dist/charts.es.js +555 -2
  15. package/dist/charts.es.js.map +1 -1
  16. package/dist/chunks/ChatView-BnC15uoD.js +2 -0
  17. package/dist/chunks/{ChatView-CGBaudUc.js.map → ChatView-BnC15uoD.js.map} +1 -1
  18. package/dist/chunks/{ChatView-DguKw-gR.js → ChatView-D-5lHZ5H.js} +7 -8
  19. package/dist/chunks/{ChatView-DguKw-gR.js.map → ChatView-D-5lHZ5H.js.map} +1 -1
  20. package/dist/chunks/{Collection-DD1_31eh.js → Collection-B64LJ92k.js} +2 -2
  21. package/dist/chunks/{Collection-DD1_31eh.js.map → Collection-B64LJ92k.js.map} +1 -1
  22. package/dist/chunks/{Collection-YRfGoT73.js → Collection-CsAk0UhA.js} +2 -2
  23. package/dist/chunks/{Collection-YRfGoT73.js.map → Collection-CsAk0UhA.js.map} +1 -1
  24. package/dist/chunks/ContextMenu-CfMAB33c.js +3 -0
  25. package/dist/chunks/ContextMenu-CfMAB33c.js.map +1 -0
  26. package/dist/chunks/{ContextMenu-B4_YS0G8.js → ContextMenu-Cvls3QC_.js} +350 -3
  27. package/dist/chunks/ContextMenu-Cvls3QC_.js.map +1 -0
  28. package/dist/chunks/DataView-DESqBxT-.js +2 -0
  29. package/dist/chunks/DataView-DESqBxT-.js.map +1 -0
  30. package/dist/chunks/{DataView-OUqaLmGB.js → DataView-QXyfcg2M.js} +3 -2
  31. package/dist/chunks/DataView-QXyfcg2M.js.map +1 -0
  32. package/dist/chunks/Dialog-BfXN-fFA.js +2 -0
  33. package/dist/chunks/Dialog-BfXN-fFA.js.map +1 -0
  34. package/dist/chunks/{Dialog-BiVgKzSK.js → Dialog-DHUsZ92-.js} +1375 -7
  35. package/dist/chunks/Dialog-DHUsZ92-.js.map +1 -0
  36. package/dist/chunks/{FormView-BClEkzmE.js → FormView-DGRmcKUG.js} +282 -123
  37. package/dist/chunks/FormView-DGRmcKUG.js.map +1 -0
  38. package/dist/chunks/FormView-KGvr68ju.js +3 -0
  39. package/dist/chunks/FormView-KGvr68ju.js.map +1 -0
  40. package/dist/chunks/{ListView-BMNhd5-B.js → ListView-BGJG4GYH.js} +3 -3
  41. package/dist/chunks/{ListView-BMNhd5-B.js.map → ListView-BGJG4GYH.js.map} +1 -1
  42. package/dist/chunks/{ListView-BRGiITfD.js → ListView-BpGEatee.js} +2 -2
  43. package/dist/chunks/{ListView-BRGiITfD.js.map → ListView-BpGEatee.js.map} +1 -1
  44. package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js → MetricsMiniChartWidget-BKbFGvXG.js} +4 -4
  45. package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js.map → MetricsMiniChartWidget-BKbFGvXG.js.map} +1 -1
  46. package/dist/chunks/MetricsMiniChartWidget-BNdGuSZV.js +2 -0
  47. package/dist/chunks/{MetricsMiniChartWidget-Esvv-lFp.js.map → MetricsMiniChartWidget-BNdGuSZV.js.map} +1 -1
  48. package/dist/chunks/{PDFViewer-NeL91Gon.js → PDFViewer-BIBNhuWY.js} +3 -3
  49. package/dist/chunks/{PDFViewer-NeL91Gon.js.map → PDFViewer-BIBNhuWY.js.map} +1 -1
  50. package/dist/chunks/{PDFViewer-D4uo3oiA.js → PDFViewer-nZAQQScE.js} +2 -2
  51. package/dist/chunks/{PDFViewer-D4uo3oiA.js.map → PDFViewer-nZAQQScE.js.map} +1 -1
  52. package/dist/chunks/Rest-BpDyhFfG.js +2 -0
  53. package/dist/chunks/Rest-BpDyhFfG.js.map +1 -0
  54. package/dist/chunks/{Rest-CS4jRCAs.js → Rest-DpbPbmra.js} +96 -5
  55. package/dist/chunks/Rest-DpbPbmra.js.map +1 -0
  56. package/dist/chunks/TokenManager-BWc_pRpg.js +2 -0
  57. package/dist/chunks/TokenManager-BWc_pRpg.js.map +1 -0
  58. package/dist/chunks/{TopNav-DC8oGpHp.js → TokenManager-N3e5wDu1.js} +369 -6
  59. package/dist/chunks/TokenManager-N3e5wDu1.js.map +1 -0
  60. package/dist/chunks/{WebSocketClient-D-5DJoMX.js → WebSocketClient-DghNkEyO.js} +2 -2
  61. package/dist/chunks/{WebSocketClient-D-5DJoMX.js.map → WebSocketClient-DghNkEyO.js.map} +1 -1
  62. package/dist/chunks/{WebSocketClient-DzcqAmho.js → WebSocketClient-E08hfP5f.js} +2 -2
  63. package/dist/chunks/{WebSocketClient-DzcqAmho.js.map → WebSocketClient-E08hfP5f.js.map} +1 -1
  64. package/dist/chunks/version-CKPqwcQJ.js +2 -0
  65. package/dist/chunks/version-CKPqwcQJ.js.map +1 -0
  66. package/dist/chunks/version-Dtwh-YkD.js +38 -0
  67. package/dist/chunks/version-Dtwh-YkD.js.map +1 -0
  68. package/dist/css/web-mojo.css +1 -17
  69. package/dist/docit.cjs.js +1 -1
  70. package/dist/docit.cjs.js.map +1 -1
  71. package/dist/docit.es.js +6 -8
  72. package/dist/docit.es.js.map +1 -1
  73. package/dist/index.cjs.js +1 -1
  74. package/dist/index.cjs.js.map +1 -1
  75. package/dist/index.es.js +34 -36
  76. package/dist/index.es.js.map +1 -1
  77. package/dist/lightbox.cjs.js +1 -1
  78. package/dist/lightbox.cjs.js.map +1 -1
  79. package/dist/lightbox.es.js +5 -4
  80. package/dist/lightbox.es.js.map +1 -1
  81. package/dist/map.cjs.js +1 -1
  82. package/dist/map.cjs.js.map +1 -1
  83. package/dist/map.es.js +82 -3
  84. package/dist/map.es.js.map +1 -1
  85. package/dist/timeline.cjs.js +1 -1
  86. package/dist/timeline.es.js +4 -4
  87. package/package.json +1 -1
  88. package/dist/chunks/ChatView-CGBaudUc.js +0 -2
  89. package/dist/chunks/ContextMenu-B4_YS0G8.js.map +0 -1
  90. package/dist/chunks/ContextMenu-DcLhcYMp.js +0 -3
  91. package/dist/chunks/ContextMenu-DcLhcYMp.js.map +0 -1
  92. package/dist/chunks/DataView-CdDY9ijM.js +0 -2
  93. package/dist/chunks/DataView-CdDY9ijM.js.map +0 -1
  94. package/dist/chunks/DataView-OUqaLmGB.js.map +0 -1
  95. package/dist/chunks/Dialog-BiVgKzSK.js.map +0 -1
  96. package/dist/chunks/Dialog-DmIPK_Bi.js +0 -2
  97. package/dist/chunks/Dialog-DmIPK_Bi.js.map +0 -1
  98. package/dist/chunks/FormView-BClEkzmE.js.map +0 -1
  99. package/dist/chunks/FormView-nulck4nL.js +0 -3
  100. package/dist/chunks/FormView-nulck4nL.js.map +0 -1
  101. package/dist/chunks/MetricsMiniChartWidget-Esvv-lFp.js +0 -2
  102. package/dist/chunks/Page-CvbwEoLv.js +0 -2
  103. package/dist/chunks/Page-CvbwEoLv.js.map +0 -1
  104. package/dist/chunks/Page-Deq4y2Kq.js +0 -351
  105. package/dist/chunks/Page-Deq4y2Kq.js.map +0 -1
  106. package/dist/chunks/Rest-BNYqGlnP.js +0 -2
  107. package/dist/chunks/Rest-BNYqGlnP.js.map +0 -1
  108. package/dist/chunks/Rest-CS4jRCAs.js.map +0 -1
  109. package/dist/chunks/TokenManager-CAZNcCMs.js +0 -366
  110. package/dist/chunks/TokenManager-CAZNcCMs.js.map +0 -1
  111. package/dist/chunks/TokenManager-CJBYcVqs.js +0 -2
  112. package/dist/chunks/TokenManager-CJBYcVqs.js.map +0 -1
  113. package/dist/chunks/TopNav-23B5R-dl.js +0 -2
  114. package/dist/chunks/TopNav-23B5R-dl.js.map +0 -1
  115. package/dist/chunks/TopNav-DC8oGpHp.js.map +0 -1
  116. package/dist/chunks/WebApp-C1vcdSuu.js +0 -1388
  117. package/dist/chunks/WebApp-C1vcdSuu.js.map +0 -1
  118. package/dist/chunks/WebApp-CpxtmTk0.js +0 -2
  119. package/dist/chunks/WebApp-CpxtmTk0.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"charts.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
1
+ {"version":3,"file":"charts.cjs.js","sources":["../src/extensions/charts/CircularProgress.js"],"sourcesContent":["/**\n * CircularProgress - Modern circular progress indicator component\n * Supports single/multi-segment progress, animations, gradients, and tooltips\n * Uses SVG for crisp rendering at any size\n */\n\nimport View from '@core/View.js';\nimport dataFormatter from '@core/utils/DataFormatter.js';\n\nexport default class CircularProgress extends View {\n constructor(options = {}) {\n super({\n className: `circular-progress ${options.className || ''}`,\n ...options\n });\n\n // Size presets\n this.SIZE_PRESETS = {\n 'xs': 40,\n 'sm': 60,\n 'md': 80,\n 'lg': 120,\n 'xl': 180\n };\n\n // Stroke width presets (auto-calculated based on size)\n this.STROKE_PRESETS = {\n 'xs': 4,\n 'sm': 6,\n 'md': 8,\n 'lg': 12,\n 'xl': 16\n };\n\n // Core configuration\n this.value = options.value !== undefined ? options.value : 0;\n this.min = options.min !== undefined ? options.min : 0;\n this.max = options.max !== undefined ? options.max : 100;\n\n // Dimensions\n this.sizePreset = (typeof options.size === 'string' && this.SIZE_PRESETS[options.size]) ? options.size : null;\n this.size = this.resolveSize(options.size !== undefined ? options.size : 'md');\n this.strokeWidth = options.strokeWidth === 'auto' || options.strokeWidth === undefined\n ? this.getAutoStrokeWidth(options.size)\n : options.strokeWidth;\n\n // Colors & Styling\n this.theme = options.theme || 'basic'; // 'basic', '3d', 'dark', 'light'\n this.variant = options.variant || 'default';\n this.color = options.color; // Will be set by applyVariant if not provided\n this.trackColor = options.trackColor; // Will be set by applyTheme if not provided\n this.textColor = options.textColor; // Custom text color\n this.gradientColors = options.gradientColors || null;\n\n // Apply theme (sets colors based on theme)\n this.applyTheme();\n \n // Apply variant colors (sets this.color if not provided)\n this.applyVariant();\n\n // Arc configuration\n this.rotation = options.rotation !== undefined ? options.rotation : -90; // Start at top\n this.gap = options.gap || 0; // Gap in degrees (0 = full circle)\n\n // Center content\n this.showValue = options.showValue !== false;\n this.valueFormat = options.valueFormat || 'percentage';\n this.valueFormatter = options.valueFormatter || null;\n this.label = options.label || null;\n this.labelHtml = options.labelHtml || null;\n this.icon = options.icon || null;\n\n // Animation\n this.animate = options.animate !== false;\n this.animationDuration = options.animationDuration || 600;\n this.animationEasing = options.animationEasing || 'ease-out';\n\n // Visual options\n this.rounded = options.rounded !== false;\n this.shadow = options.shadow || false;\n\n // Interaction\n this.clickable = options.clickable || false;\n this.tooltip = options.tooltip || null;\n this.tooltipPlacement = options.tooltipPlacement || 'top';\n\n // Multi-segment mode\n this.segments = options.segments || null;\n this.segmentGap = options.segmentGap || 2; // Gap between segments in degrees\n\n // DataFormatter instance\n this.dataFormatter = dataFormatter;\n\n // Internal state\n this.svg = null;\n this.centerElement = null;\n this.popover = null;\n this.gradientId = `gradient-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n resolveSize(size) {\n if (typeof size === 'string' && this.SIZE_PRESETS[size]) {\n return this.SIZE_PRESETS[size];\n }\n return typeof size === 'number' ? size : this.SIZE_PRESETS.md;\n }\n\n getAutoStrokeWidth(size) {\n if (typeof size === 'string' && this.STROKE_PRESETS[size]) {\n return this.STROKE_PRESETS[size];\n }\n // Auto-calculate based on size\n const actualSize = this.resolveSize(size);\n if (actualSize <= 40) return 4;\n if (actualSize <= 60) return 6;\n if (actualSize <= 80) return 8;\n if (actualSize <= 120) return 12;\n return 16;\n }\n\n applyTheme() {\n const themes = {\n 'basic': {\n trackColor: '#e9ecef',\n textColor: null, // Use default\n backgroundColor: null\n },\n 'shadowed': {\n trackColor: '#d1d5db',\n textColor: null,\n backgroundColor: null,\n shadow: true\n },\n 'dark': {\n trackColor: '#374151',\n textColor: '#e5e7eb',\n backgroundColor: '#1f2937'\n },\n 'light': {\n trackColor: '#f3f4f6',\n textColor: '#111827',\n backgroundColor: '#ffffff'\n }\n };\n\n const themeConfig = themes[this.theme] || themes.basic;\n \n // Apply theme defaults if not explicitly set\n if (!this.trackColor) {\n this.trackColor = themeConfig.trackColor;\n }\n if (!this.textColor && themeConfig.textColor) {\n this.textColor = themeConfig.textColor;\n }\n if (themeConfig.shadow && this.shadow === false) {\n this.shadow = themeConfig.shadow;\n }\n }\n\n applyVariant() {\n const variants = {\n 'success': { color: '#198754', trackColor: 'rgba(25, 135, 84, 0.1)' },\n 'danger': { color: '#dc3545', trackColor: 'rgba(220, 53, 69, 0.1)' },\n 'warning': { color: '#ffc107', trackColor: 'rgba(255, 193, 7, 0.1)' },\n 'info': { color: '#0dcaf0', trackColor: 'rgba(13, 202, 240, 0.1)' },\n 'default': { color: '#0d6efd' } // Default blue color\n };\n\n if (variants[this.variant]) {\n const variantColors = variants[this.variant];\n if (!this.color) {\n this.color = variantColors.color;\n }\n if (variantColors.trackColor && this.trackColor === this.applyTheme.trackColor) {\n this.trackColor = variantColors.trackColor;\n }\n }\n \n // Fallback if no color is set\n if (!this.color) {\n this.color = '#0d6efd';\n }\n }\n\n getTemplate() {\n const sizeClass = this.sizePreset ? `circular-progress-${this.sizePreset}` : '';\n const variantClass = this.variant !== 'default' ? `circular-progress-${this.variant}` : '';\n const themeClass = this.theme !== 'basic' ? `circular-progress-theme-${this.theme}` : '';\n const clickableClass = this.clickable ? 'circular-progress-clickable' : '';\n const shadowClass = this.shadow ? 'circular-progress-shadow' : '';\n \n const textColorStyle = this.textColor ? `color: ${this.textColor};` : '';\n\n return `\n <div class=\"circular-progress-container ${sizeClass} ${variantClass} ${themeClass} ${clickableClass} ${shadowClass}\"\n style=\"width: ${this.size}px; height: ${this.size}px;\">\n <svg class=\"circular-progress-svg\" \n width=\"${this.size}\" \n height=\"${this.size}\"\n viewBox=\"0 0 ${this.size} ${this.size}\">\n </svg>\n <div class=\"circular-progress-center\" style=\"${textColorStyle}\">\n <div class=\"circular-progress-content\"></div>\n </div>\n </div>\n `;\n }\n\n async onAfterRender() {\n this.svg = this.element.querySelector('.circular-progress-svg');\n this.centerElement = this.element.querySelector('.circular-progress-content');\n this.containerElement = this.element.querySelector('.circular-progress-container');\n\n // Render the progress circle\n this.renderProgress();\n\n // Render center content\n this.renderCenterContent();\n\n // Setup interactions\n if (this.clickable) {\n this.setupClickHandler();\n }\n\n // Setup tooltip\n if (this.tooltip && this.clickable) {\n this.setupTooltip();\n }\n }\n\n renderProgress() {\n if (!this.svg) return;\n\n // Clear previous content\n this.svg.innerHTML = '';\n\n const center = this.size / 2;\n const radius = (this.size - this.strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n\n // Create gradient definition if needed\n if (this.gradientColors && this.gradientColors.length > 1) {\n this.createGradient();\n }\n\n // Determine if we're using segments or single progress\n if (this.segments && Array.isArray(this.segments) && this.segments.length > 0) {\n this.renderSegments(center, radius, circumference);\n } else {\n this.renderSingleProgress(center, radius, circumference);\n }\n }\n\n renderSingleProgress(center, radius, circumference) {\n // Calculate arc length\n const arcLength = this.gap > 0 ? (360 - this.gap) : 360;\n const arcCircumference = (arcLength / 360) * circumference;\n\n // Create track (background circle/arc)\n const track = this.createCircle(center, radius, {\n stroke: this.trackColor,\n strokeWidth: this.strokeWidth,\n fill: 'none',\n strokeLinecap: this.rounded ? 'round' : 'butt',\n strokeDasharray: this.gap > 0 ? `${arcCircumference} ${circumference}` : 'none',\n transform: `rotate(${this.rotation} ${center} ${center})`\n });\n this.svg.appendChild(track);\n\n // Create progress circle\n const percentage = this.getPercentage();\n const progressLength = (percentage / 100) * arcCircumference;\n const dashOffset = arcCircumference - progressLength;\n\n const strokeColor = this.gradientColors ? `url(#${this.gradientId})` : this.color;\n\n const progress = this.createCircle(center, radius, {\n stroke: strokeColor,\n strokeWidth: this.strokeWidth,\n fill: 'none',\n strokeLinecap: this.rounded ? 'round' : 'butt',\n strokeDasharray: `${arcCircumference} ${circumference}`,\n strokeDashoffset: this.animate ? arcCircumference : dashOffset,\n transform: `rotate(${this.rotation} ${center} ${center})`,\n class: 'circular-progress-bar'\n });\n\n this.svg.appendChild(progress);\n\n // Apply animation\n if (this.animate) {\n this.animateProgress(progress, dashOffset);\n }\n }\n\n renderSegments(center, radius, circumference) {\n // Calculate arc length\n const arcLength = this.gap > 0 ? (360 - this.gap) : 360;\n const arcCircumference = (arcLength / 360) * circumference;\n\n // Create track\n const track = this.createCircle(center, radius, {\n stroke: this.trackColor,\n strokeWidth: this.strokeWidth,\n fill: 'none',\n strokeLinecap: this.rounded ? 'round' : 'butt',\n strokeDasharray: this.gap > 0 ? `${arcCircumference} ${circumference}` : 'none',\n transform: `rotate(${this.rotation} ${center} ${center})`\n });\n this.svg.appendChild(track);\n\n // Validate segments total\n const total = this.segments.reduce((sum, seg) => sum + (seg.value || 0), 0);\n if (total > this.max) {\n console.warn('CircularProgress: Segment total exceeds max value. Clamping to max.');\n }\n\n // Render each segment\n let currentOffset = 0;\n\n this.segments.forEach((segment, index) => {\n const segmentPercentage = ((segment.value || 0) / (this.max - this.min)) * 100;\n const segmentLength = (segmentPercentage / 100) * arcCircumference;\n\n // Gap between segments (in circumference units)\n const gapLength = (this.segmentGap / 360) * circumference;\n\n if (segmentLength > 0) {\n const segmentCircle = this.createCircle(center, radius, {\n stroke: segment.color || this.color,\n strokeWidth: this.strokeWidth,\n fill: 'none',\n strokeLinecap: this.rounded ? 'round' : 'butt',\n strokeDasharray: `${segmentLength} ${circumference}`,\n strokeDashoffset: this.animate ? arcCircumference : -(currentOffset),\n transform: `rotate(${this.rotation} ${center} ${center})`,\n class: `circular-progress-segment circular-progress-segment-${index}`,\n 'data-segment-index': index\n });\n\n this.svg.appendChild(segmentCircle);\n\n // Apply animation\n if (this.animate) {\n this.animateProgress(segmentCircle, -(currentOffset), index * 100);\n }\n\n // Update offset for next segment\n currentOffset += segmentLength + gapLength;\n }\n });\n }\n\n createCircle(cx, cy, attributes = {}) {\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.setAttribute('cx', cx);\n circle.setAttribute('cy', cx); // Use cx for cy since we pass center for both\n circle.setAttribute('r', cy); // cy parameter is actually the radius\n\n Object.entries(attributes).forEach(([key, value]) => {\n if (key === 'strokeWidth') {\n circle.setAttribute('stroke-width', value);\n } else if (key === 'strokeLinecap') {\n circle.setAttribute('stroke-linecap', value);\n } else if (key === 'strokeDasharray') {\n circle.setAttribute('stroke-dasharray', value);\n } else if (key === 'strokeDashoffset') {\n circle.setAttribute('stroke-dashoffset', value);\n } else {\n circle.setAttribute(key, value);\n }\n });\n\n return circle;\n }\n\n createGradient() {\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const gradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient');\n gradient.setAttribute('id', this.gradientId);\n gradient.setAttribute('x1', '0%');\n gradient.setAttribute('y1', '0%');\n gradient.setAttribute('x2', '100%');\n gradient.setAttribute('y2', '100%');\n\n this.gradientColors.forEach((color, index) => {\n const stop = document.createElementNS('http://www.w3.org/2000/svg', 'stop');\n const offset = (index / (this.gradientColors.length - 1)) * 100;\n stop.setAttribute('offset', `${offset}%`);\n stop.setAttribute('stop-color', color);\n gradient.appendChild(stop);\n });\n\n defs.appendChild(gradient);\n this.svg.appendChild(defs);\n }\n\n animateProgress(circle, targetOffset, delay = 0) {\n setTimeout(() => {\n circle.style.transition = `stroke-dashoffset ${this.animationDuration}ms ${this.animationEasing}`;\n circle.style.strokeDashoffset = targetOffset;\n }, delay);\n }\n\n renderCenterContent() {\n if (!this.centerElement) return;\n\n // Priority: labelHtml > icon > value/label\n if (this.labelHtml) {\n this.centerElement.innerHTML = this.labelHtml;\n } else if (this.icon) {\n this.centerElement.innerHTML = `<i class=\"${this.icon}\"></i>`;\n } else if (this.showValue) {\n const formattedValue = this.getFormattedValue();\n let html = `<div class=\"circular-progress-value\">${formattedValue}</div>`;\n \n if (this.label) {\n html += `<div class=\"circular-progress-label\">${this.label}</div>`;\n }\n\n this.centerElement.innerHTML = html;\n }\n }\n\n getFormattedValue() {\n const value = this.value;\n const min = this.min;\n const max = this.max;\n\n // Custom formatter function takes precedence\n if (this.valueFormatter && typeof this.valueFormatter === 'function') {\n return this.valueFormatter(value, min, max);\n }\n\n // Built-in formats\n switch (this.valueFormat) {\n case 'percentage':\n return `${Math.round(this.getPercentage())}%`;\n \n case 'fraction':\n return `${value}/${max}`;\n \n case 'value':\n return value.toString();\n \n default:\n // Try DataFormatter\n if (this.dataFormatter) {\n try {\n return this.dataFormatter.pipe(value, this.valueFormat);\n } catch (error) {\n console.warn('CircularProgress: DataFormatter error, falling back to percentage', error);\n return `${Math.round(this.getPercentage())}%`;\n }\n }\n return `${Math.round(this.getPercentage())}%`;\n }\n }\n\n getPercentage() {\n const range = this.max - this.min;\n if (range === 0) return 0;\n return ((this.value - this.min) / range) * 100;\n }\n\n setupClickHandler() {\n if (!this.containerElement) return;\n\n this.containerElement.style.cursor = 'pointer';\n \n this.containerElement.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n const percentage = this.getPercentage();\n \n this.emit('progress:clicked', {\n value: this.value,\n percentage,\n min: this.min,\n max: this.max\n });\n\n // Toggle popover if tooltip is configured\n if (this.tooltip) {\n this.togglePopover();\n }\n });\n }\n\n setupTooltip() {\n // Bootstrap popover will be initialized on first click\n // We'll create the popover content dynamically\n }\n\n togglePopover() {\n if (!this.containerElement || typeof window.bootstrap === 'undefined') {\n console.warn('CircularProgress: Bootstrap is required for tooltip support');\n return;\n }\n\n // Get or create popover instance\n if (!this.popover) {\n const content = this.getTooltipContent();\n const title = typeof this.tooltip === 'object' && this.tooltip.title ? this.tooltip.title : undefined;\n\n // Build config object, omitting title if undefined\n const popoverConfig = {\n content: content,\n html: true,\n placement: this.tooltipPlacement,\n trigger: 'manual',\n container: 'body'\n };\n \n // Only add title if it exists\n if (title) {\n popoverConfig.title = title;\n }\n\n this.popover = new window.bootstrap.Popover(this.containerElement, popoverConfig);\n }\n\n // Toggle visibility\n const popoverElement = window.bootstrap.Popover.getInstance(this.containerElement);\n if (popoverElement && this.containerElement.getAttribute('aria-describedby')) {\n this.popover.hide();\n } else {\n // Update content before showing\n this.popover.setContent({\n '.popover-body': this.getTooltipContent()\n });\n this.popover.show();\n }\n }\n\n getTooltipContent() {\n if (typeof this.tooltip === 'function') {\n return this.tooltip(this.value, {\n min: this.min,\n max: this.max,\n percentage: this.getPercentage()\n });\n }\n\n if (typeof this.tooltip === 'object') {\n return this.tooltip.html || this.tooltip.content || '';\n }\n\n return this.tooltip || '';\n }\n\n // Public API\n\n setValue(value, animate = true) {\n const oldValue = this.value;\n this.value = Math.max(this.min, Math.min(this.max, value));\n \n // Update center content\n this.renderCenterContent();\n \n // Update progress without full re-render\n if (this.svg && !this.segments) {\n const progressBar = this.svg.querySelector('.circular-progress-bar');\n if (progressBar) {\n const radius = (this.size / 2) - (this.strokeWidth / 2);\n const circumference = 2 * Math.PI * radius;\n const arcLength = this.gap > 0 ? (360 - this.gap) : 360;\n const arcCircumference = (arcLength / 360) * circumference;\n const percentage = this.getPercentage();\n const progressLength = (percentage / 100) * arcCircumference;\n const dashOffset = arcCircumference - progressLength;\n \n if (animate) {\n // Animate from current offset to new offset\n progressBar.style.transition = `stroke-dashoffset ${this.animationDuration}ms ${this.animationEasing}`;\n progressBar.style.strokeDashoffset = dashOffset;\n } else {\n // Update immediately without animation\n progressBar.style.transition = 'none';\n progressBar.style.strokeDashoffset = dashOffset;\n }\n }\n } else {\n // For segments or if no existing progress bar, do full re-render\n const oldAnimate = this.animate;\n this.animate = animate;\n this.renderProgress();\n this.animate = oldAnimate;\n }\n }\n\n setRange(min, max) {\n this.min = min;\n this.max = max;\n this.renderProgress();\n this.renderCenterContent();\n }\n\n increment(amount = 1) {\n this.setValue(this.value + amount);\n }\n\n decrement(amount = 1) {\n this.setValue(this.value - amount);\n }\n\n setColor(color) {\n this.color = color;\n this.gradientColors = null; // Clear gradient\n \n // Update color without full re-render\n if (this.svg && !this.segments) {\n const progressBar = this.svg.querySelector('.circular-progress-bar');\n if (progressBar) {\n progressBar.setAttribute('stroke', color);\n }\n } else {\n // For segments, need to re-render\n this.renderProgress();\n }\n }\n\n setGradient(colors) {\n if (Array.isArray(colors) && colors.length > 1) {\n this.gradientColors = colors;\n this.gradientId = `gradient-${Math.random().toString(36).substr(2, 9)}`;\n this.renderProgress();\n }\n }\n\n setSize(size) {\n // Remove old size class if it exists\n if (this.containerElement && this.sizePreset) {\n this.containerElement.classList.remove(`circular-progress-${this.sizePreset}`);\n }\n \n // Update size preset if the new size is a preset string\n this.sizePreset = (typeof size === 'string' && this.SIZE_PRESETS[size]) ? size : null;\n this.size = this.resolveSize(size);\n this.strokeWidth = this.getAutoStrokeWidth(size);\n \n // Add new size class if it's a preset\n if (this.containerElement) {\n this.containerElement.style.width = `${this.size}px`;\n this.containerElement.style.height = `${this.size}px`;\n \n if (this.sizePreset) {\n this.containerElement.classList.add(`circular-progress-${this.sizePreset}`);\n }\n }\n \n if (this.svg) {\n this.svg.setAttribute('width', this.size);\n this.svg.setAttribute('height', this.size);\n this.svg.setAttribute('viewBox', `0 0 ${this.size} ${this.size}`);\n }\n \n this.renderProgress();\n }\n\n animateTo(targetValue, duration = 1000) {\n const startValue = this.value;\n const diff = targetValue - startValue;\n const startTime = performance.now();\n\n const animate = (currentTime) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n // Ease-out function\n const easeProgress = 1 - Math.pow(1 - progress, 3);\n \n const newValue = startValue + (diff * easeProgress);\n this.setValue(newValue, false);\n\n if (progress < 1) {\n requestAnimationFrame(animate);\n } else {\n this.setValue(targetValue, false);\n }\n };\n\n requestAnimationFrame(animate);\n }\n\n pulse() {\n if (!this.containerElement) return;\n\n this.containerElement.style.animation = 'none';\n setTimeout(() => {\n this.containerElement.style.animation = 'circular-progress-pulse 0.5s ease-out';\n }, 10);\n\n setTimeout(() => {\n this.containerElement.style.animation = '';\n }, 500);\n }\n\n complete() {\n this.variant = 'success';\n this.applyVariant();\n this.setValue(this.max);\n this.pulse();\n }\n\n reset() {\n this.setValue(this.min);\n }\n\n hide() {\n if (this.element) {\n this.element.style.display = 'none';\n }\n }\n\n show() {\n if (this.element) {\n this.element.style.display = '';\n }\n }\n\n getValue() {\n return this.value;\n }\n\n getPercentageValue() {\n return this.getPercentage();\n }\n\n async onBeforeDestroy() {\n // Clean up popover\n if (this.popover) {\n this.popover.dispose();\n this.popover = null;\n }\n\n await super.onBeforeDestroy();\n }\n}\n"],"names":["CircularProgress","View","constructor","options","super","className","this","SIZE_PRESETS","xs","sm","md","lg","xl","STROKE_PRESETS","value","min","max","sizePreset","size","resolveSize","strokeWidth","getAutoStrokeWidth","theme","variant","color","trackColor","textColor","gradientColors","applyTheme","applyVariant","rotation","gap","showValue","valueFormat","valueFormatter","label","labelHtml","icon","animate","animationDuration","animationEasing","rounded","shadow","clickable","tooltip","tooltipPlacement","segments","segmentGap","dataFormatter","svg","centerElement","popover","gradientId","Math","random","toString","substr","actualSize","themes","basic","backgroundColor","shadowed","dark","light","themeConfig","variants","success","danger","warning","info","default","variantColors","getTemplate","sizeClass","variantClass","themeClass","clickableClass","shadowClass","textColorStyle","onAfterRender","element","querySelector","containerElement","renderProgress","renderCenterContent","setupClickHandler","setupTooltip","innerHTML","center","radius","circumference","PI","length","createGradient","Array","isArray","renderSegments","renderSingleProgress","arcCircumference","track","createCircle","stroke","fill","strokeLinecap","strokeDasharray","transform","appendChild","dashOffset","getPercentage","strokeColor","progress","strokeDashoffset","class","animateProgress","reduce","sum","seg","console","warn","currentOffset","forEach","segment","index","segmentLength","gapLength","segmentCircle","cx","cy","attributes","circle","document","createElementNS","setAttribute","Object","entries","key","defs","gradient","stop","offset","targetOffset","delay","setTimeout","style","transition","html","getFormattedValue","round","pipe","error","range","cursor","addEventListener","e","preventDefault","stopPropagation","percentage","emit","togglePopover","window","bootstrap","content","getTooltipContent","title","popoverConfig","placement","trigger","container","Popover","getInstance","getAttribute","hide","setContent","show","setValue","progressBar","oldAnimate","setRange","increment","amount","decrement","setColor","setGradient","colors","setSize","classList","remove","width","height","add","animateTo","targetValue","duration","startValue","diff","startTime","performance","now","currentTime","elapsed","easeProgress","pow","newValue","requestAnimationFrame","pulse","animation","complete","reset","display","getValue","getPercentageValue","onBeforeDestroy","dispose"],"mappings":"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"}
package/dist/charts.css CHANGED
@@ -1270,3 +1270,322 @@
1270
1270
  background: rgba(255, 255, 255, 0.9);
1271
1271
  color: #212529;
1272
1272
  }
1273
+
1274
+ /* ==========================================================================
1275
+ Circular Progress Component
1276
+ ========================================================================== */
1277
+
1278
+ /* Container */
1279
+ .circular-progress {
1280
+ display: inline-block;
1281
+ font-family: var(--bs-font-sans-serif, system-ui, sans-serif);
1282
+ }
1283
+
1284
+ .circular-progress-container {
1285
+ position: relative;
1286
+ display: inline-flex;
1287
+ align-items: center;
1288
+ justify-content: center;
1289
+ transition: transform 0.15s ease;
1290
+ }
1291
+
1292
+ .circular-progress-container:hover {
1293
+ transform: scale(1.02);
1294
+ }
1295
+
1296
+ /* SVG */
1297
+ .circular-progress-svg {
1298
+ display: block;
1299
+ overflow: visible;
1300
+ margin: 0 auto;
1301
+ }
1302
+
1303
+ .circular-progress-bar,
1304
+ .circular-progress-segment {
1305
+ transition: stroke-dashoffset 0.6s ease-out;
1306
+ }
1307
+
1308
+ /* Center content overlay */
1309
+ .circular-progress-center {
1310
+ position: absolute;
1311
+ top: 0;
1312
+ left: 0;
1313
+ right: 0;
1314
+ bottom: 0;
1315
+ display: flex;
1316
+ align-items: center;
1317
+ justify-content: center;
1318
+ text-align: center;
1319
+ pointer-events: none;
1320
+ }
1321
+
1322
+ .circular-progress-content {
1323
+ display: flex;
1324
+ flex-direction: column;
1325
+ align-items: center;
1326
+ justify-content: center;
1327
+ gap: 0.125rem;
1328
+ max-width: 70%;
1329
+ }
1330
+
1331
+ /* Value display */
1332
+ .circular-progress-value {
1333
+ font-size: 1.25rem;
1334
+ font-weight: 700;
1335
+ line-height: 1;
1336
+ color: var(--chart-text, #212529);
1337
+ white-space: nowrap;
1338
+ }
1339
+
1340
+ .circular-progress-label {
1341
+ font-size: 0.625rem;
1342
+ font-weight: 500;
1343
+ line-height: 1.2;
1344
+ color: var(--chart-text-muted, #6c757d);
1345
+ text-transform: uppercase;
1346
+ letter-spacing: 0.025em;
1347
+ white-space: nowrap;
1348
+ }
1349
+
1350
+ /* Icon display */
1351
+ .circular-progress-content i {
1352
+ font-size: 1.5rem;
1353
+ color: var(--chart-text, #212529);
1354
+ line-height: 1;
1355
+ }
1356
+
1357
+ /* Size variants */
1358
+ .circular-progress-container.circular-progress-xs .circular-progress-value {
1359
+ font-size: 0.625rem;
1360
+ }
1361
+
1362
+ .circular-progress-container.circular-progress-xs .circular-progress-label {
1363
+ font-size: 0.4rem;
1364
+ }
1365
+
1366
+ .circular-progress-container.circular-progress-xs .circular-progress-content i {
1367
+ font-size: 0.75rem;
1368
+ }
1369
+
1370
+ .circular-progress-container.circular-progress-sm .circular-progress-value {
1371
+ font-size: 0.875rem;
1372
+ }
1373
+
1374
+ .circular-progress-container.circular-progress-sm .circular-progress-label {
1375
+ font-size: 0.5rem;
1376
+ }
1377
+
1378
+ .circular-progress-container.circular-progress-sm .circular-progress-content i {
1379
+ font-size: 1rem;
1380
+ }
1381
+
1382
+ .circular-progress-container.circular-progress-md .circular-progress-value {
1383
+ font-size: 1.125rem;
1384
+ }
1385
+
1386
+ .circular-progress-container.circular-progress-md .circular-progress-label {
1387
+ font-size: 0.5625rem;
1388
+ }
1389
+
1390
+ .circular-progress-container.circular-progress-md .circular-progress-content i {
1391
+ font-size: 1.25rem;
1392
+ }
1393
+
1394
+ .circular-progress-container.circular-progress-lg .circular-progress-value {
1395
+ font-size: 1.5rem;
1396
+ }
1397
+
1398
+ .circular-progress-container.circular-progress-lg .circular-progress-label {
1399
+ font-size: 0.6875rem;
1400
+ }
1401
+
1402
+ .circular-progress-container.circular-progress-lg .circular-progress-content i {
1403
+ font-size: 1.75rem;
1404
+ }
1405
+
1406
+ .circular-progress-container.circular-progress-xl .circular-progress-value {
1407
+ font-size: 2.25rem;
1408
+ }
1409
+
1410
+ .circular-progress-container.circular-progress-xl .circular-progress-label {
1411
+ font-size: 0.8125rem;
1412
+ }
1413
+
1414
+ .circular-progress-container.circular-progress-xl .circular-progress-content i {
1415
+ font-size: 2.5rem;
1416
+ }
1417
+
1418
+ /* Variant colors */
1419
+ .circular-progress-container.circular-progress-success .circular-progress-value {
1420
+ color: #198754;
1421
+ }
1422
+
1423
+ .circular-progress-container.circular-progress-success .circular-progress-content i {
1424
+ color: #198754;
1425
+ }
1426
+
1427
+ .circular-progress-container.circular-progress-danger .circular-progress-value {
1428
+ color: #dc3545;
1429
+ }
1430
+
1431
+ .circular-progress-container.circular-progress-danger .circular-progress-content i {
1432
+ color: #dc3545;
1433
+ }
1434
+
1435
+ .circular-progress-container.circular-progress-warning .circular-progress-value {
1436
+ color: #ffc107;
1437
+ }
1438
+
1439
+ .circular-progress-container.circular-progress-warning .circular-progress-content i {
1440
+ color: #ffc107;
1441
+ }
1442
+
1443
+ .circular-progress-container.circular-progress-info .circular-progress-value {
1444
+ color: #0dcaf0;
1445
+ }
1446
+
1447
+ .circular-progress-container.circular-progress-info .circular-progress-content i {
1448
+ color: #0dcaf0;
1449
+ }
1450
+
1451
+ /* Clickable state */
1452
+ .circular-progress-clickable .circular-progress-container {
1453
+ cursor: pointer;
1454
+ transition:
1455
+ transform 0.15s ease,
1456
+ filter 0.15s ease;
1457
+ }
1458
+
1459
+ .circular-progress-clickable .circular-progress-container:hover {
1460
+ transform: scale(1.05);
1461
+ filter: brightness(1.1);
1462
+ }
1463
+
1464
+ .circular-progress-clickable .circular-progress-container:active {
1465
+ transform: scale(0.98);
1466
+ }
1467
+
1468
+ /* Shadow variant */
1469
+ .circular-progress-shadow .circular-progress-container {
1470
+ filter: drop-shadow(0 0.25rem 0.5rem rgba(0, 0, 0, 0.15));
1471
+ }
1472
+
1473
+ /* Theme: Shadowed */
1474
+ .circular-progress-theme-shadowed .circular-progress-svg {
1475
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
1476
+ }
1477
+
1478
+ .circular-progress-theme-shadowed circle[class*="progress"] {
1479
+ filter: drop-shadow(0 3px 6px rgba(0, 0, 0, 0.2)) drop-shadow(0 1px 3px rgba(0, 0, 0, 0.3));
1480
+ }
1481
+
1482
+ .circular-progress-theme-shadowed .circular-progress-svg circle:not([class]) {
1483
+ /* Track circle - shadow effect */
1484
+ filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));
1485
+ }
1486
+
1487
+ /* Theme: Dark */
1488
+ .circular-progress-theme-dark {
1489
+ background: #1f2937;
1490
+ border-radius: 0.5rem;
1491
+ padding: 1rem;
1492
+ }
1493
+
1494
+ .circular-progress-theme-dark .circular-progress-value,
1495
+ .circular-progress-theme-dark .circular-progress-label {
1496
+ color: #e5e7eb;
1497
+ }
1498
+
1499
+ /* Theme: Light */
1500
+ .circular-progress-theme-light {
1501
+ background: #ffffff;
1502
+ border-radius: 0.5rem;
1503
+ padding: 1rem;
1504
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
1505
+ }
1506
+
1507
+ .circular-progress-theme-light .circular-progress-value,
1508
+ .circular-progress-theme-light .circular-progress-label {
1509
+ color: #111827;
1510
+ }
1511
+
1512
+ /* Pulse animation */
1513
+ @keyframes circular-progress-pulse {
1514
+ 0% {
1515
+ transform: scale(1);
1516
+ }
1517
+ 50% {
1518
+ transform: scale(1.1);
1519
+ }
1520
+ 100% {
1521
+ transform: scale(1);
1522
+ }
1523
+ }
1524
+
1525
+ /* Dark theme adjustments */
1526
+ [data-theme="dark"] .circular-progress-value {
1527
+ color: var(--chart-text, #ffffff);
1528
+ }
1529
+
1530
+ [data-theme="dark"] .circular-progress-label {
1531
+ color: var(--chart-text-muted, #adb5bd);
1532
+ }
1533
+
1534
+ [data-theme="dark"] .circular-progress-content i {
1535
+ color: var(--chart-text, #ffffff);
1536
+ }
1537
+
1538
+ [data-theme="dark"] .circular-progress-success .circular-progress-value,
1539
+ [data-theme="dark"] .circular-progress-success .circular-progress-content i {
1540
+ color: #75b798;
1541
+ }
1542
+
1543
+ [data-theme="dark"] .circular-progress-danger .circular-progress-value,
1544
+ [data-theme="dark"] .circular-progress-danger .circular-progress-content i {
1545
+ color: #ea868f;
1546
+ }
1547
+
1548
+ [data-theme="dark"] .circular-progress-warning .circular-progress-value,
1549
+ [data-theme="dark"] .circular-progress-warning .circular-progress-content i {
1550
+ color: #ffda6a;
1551
+ }
1552
+
1553
+ [data-theme="dark"] .circular-progress-info .circular-progress-value,
1554
+ [data-theme="dark"] .circular-progress-info .circular-progress-content i {
1555
+ color: #6edff6;
1556
+ }
1557
+
1558
+ /* Accessibility */
1559
+ @media (prefers-reduced-motion: reduce) {
1560
+ .circular-progress-bar,
1561
+ .circular-progress-segment,
1562
+ .circular-progress-container {
1563
+ transition: none !important;
1564
+ animation: none !important;
1565
+ }
1566
+ }
1567
+
1568
+ /* High contrast mode */
1569
+ @media (prefers-contrast: high) {
1570
+ .circular-progress-container {
1571
+ outline: 2px solid currentColor;
1572
+ outline-offset: 2px;
1573
+ }
1574
+ }
1575
+
1576
+ /* Focus styles for accessibility */
1577
+ .circular-progress-clickable .circular-progress-container:focus {
1578
+ outline: 2px solid var(--bs-primary, #0d6efd);
1579
+ outline-offset: 2px;
1580
+ }
1581
+
1582
+ /* Print styles */
1583
+ @media print {
1584
+ .circular-progress-container {
1585
+ break-inside: avoid;
1586
+ }
1587
+
1588
+ .circular-progress-clickable .circular-progress-container {
1589
+ cursor: default;
1590
+ }
1591
+ }