dishui 0.0.91 → 0.0.101

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 (156) hide show
  1. package/dist/.release-verified.json +6 -0
  2. package/dist/ai.js +24 -0
  3. package/dist/components/Card/Metric2.js +11 -11
  4. package/dist/components/Card/Metric2.js.map +1 -1
  5. package/dist/components/Card/Ticket.d.ts +52 -0
  6. package/dist/components/Card/Ticket2.js +218 -0
  7. package/dist/components/Card/Ticket2.js.map +1 -0
  8. package/dist/components/Card/index.d.ts +32 -0
  9. package/dist/components/Card/index.js +211 -203
  10. package/dist/components/Card/index.js.map +1 -1
  11. package/dist/components/GroupButton/index.js +4 -4
  12. package/dist/components/GroupButton/index.js.map +1 -1
  13. package/dist/components/GroupedTable/index.js +10 -10
  14. package/dist/components/GroupedTable/index.js.map +1 -1
  15. package/dist/components/NavigationList/index.js +9 -9
  16. package/dist/components/NavigationList/index.js.map +1 -1
  17. package/dist/components/Section/index.js +11 -11
  18. package/dist/components/Section/index.js.map +1 -1
  19. package/dist/components/Skeleton/index.js +1 -1
  20. package/dist/components/Skeleton/index.js.map +1 -1
  21. package/dist/components/Table/index.js +6 -6
  22. package/dist/components/Table/index.js.map +1 -1
  23. package/dist/components/ai/AgentChat/index.d.ts +54 -0
  24. package/dist/components/ai/AgentChat/index.js +176 -0
  25. package/dist/components/ai/AgentChat/index.js.map +1 -0
  26. package/dist/components/ai/AgentRunCard/index.d.ts +38 -0
  27. package/dist/components/ai/AgentRunCard/index.js +100 -0
  28. package/dist/components/ai/AgentRunCard/index.js.map +1 -0
  29. package/dist/components/ai/AgentScreen/index.d.ts +50 -0
  30. package/dist/components/ai/AgentScreen/index.js +233 -0
  31. package/dist/components/ai/AgentScreen/index.js.map +1 -0
  32. package/dist/components/ai/ApprovalCard/index.d.ts +26 -0
  33. package/dist/components/ai/ApprovalCard/index.js +89 -0
  34. package/dist/components/ai/ApprovalCard/index.js.map +1 -0
  35. package/dist/components/ai/CodeView/index.d.ts +30 -0
  36. package/dist/components/ai/CodeView/index.js +149 -0
  37. package/dist/components/ai/CodeView/index.js.map +1 -0
  38. package/dist/components/ai/CommandSearch/index.d.ts +39 -0
  39. package/dist/components/ai/CommandSearch/index.js +217 -0
  40. package/dist/components/ai/CommandSearch/index.js.map +1 -0
  41. package/dist/components/ai/ContextCards/index.d.ts +42 -0
  42. package/dist/components/ai/ContextCards/index.js +106 -0
  43. package/dist/components/ai/ContextCards/index.js.map +1 -0
  44. package/dist/components/ai/DiffTable/index.d.ts +70 -0
  45. package/dist/components/ai/DiffTable/index.js +235 -0
  46. package/dist/components/ai/DiffTable/index.js.map +1 -0
  47. package/dist/components/ai/FilterTable/index.d.ts +35 -0
  48. package/dist/components/ai/FilterTable/index.js +86 -0
  49. package/dist/components/ai/FilterTable/index.js.map +1 -0
  50. package/dist/components/ai/FineTuneCard/index.d.ts +24 -0
  51. package/dist/components/ai/FineTuneCard/index.js +75 -0
  52. package/dist/components/ai/FineTuneCard/index.js.map +1 -0
  53. package/dist/components/ai/InsightCards/index.d.ts +23 -0
  54. package/dist/components/ai/InsightCards/index.js +64 -0
  55. package/dist/components/ai/InsightCards/index.js.map +1 -0
  56. package/dist/components/ai/IssueCard/index.d.ts +39 -0
  57. package/dist/components/ai/IssueCard/index.js +78 -0
  58. package/dist/components/ai/IssueCard/index.js.map +1 -0
  59. package/dist/components/ai/LoadingState/index.d.ts +22 -0
  60. package/dist/components/ai/LoadingState/index.js +80 -0
  61. package/dist/components/ai/LoadingState/index.js.map +1 -0
  62. package/dist/components/ai/PromptBar/index.d.ts +26 -0
  63. package/dist/components/ai/PromptBar/index.js +117 -0
  64. package/dist/components/ai/PromptBar/index.js.map +1 -0
  65. package/dist/components/ai/RecommendationCard/index.d.ts +44 -0
  66. package/dist/components/ai/RecommendationCard/index.js +142 -0
  67. package/dist/components/ai/RecommendationCard/index.js.map +1 -0
  68. package/dist/components/ai/RecordsTable/index.d.ts +65 -0
  69. package/dist/components/ai/RecordsTable/index.js +334 -0
  70. package/dist/components/ai/RecordsTable/index.js.map +1 -0
  71. package/dist/components/ai/SelectionActions/index.d.ts +19 -0
  72. package/dist/components/ai/SelectionActions/index.js +40 -0
  73. package/dist/components/ai/SelectionActions/index.js.map +1 -0
  74. package/dist/components/ai/StateFlow/index.d.ts +24 -0
  75. package/dist/components/ai/StateFlow/index.js +50 -0
  76. package/dist/components/ai/StateFlow/index.js.map +1 -0
  77. package/dist/components/ai/StreamingText/index.d.ts +44 -0
  78. package/dist/components/ai/StreamingText/index.js +211 -0
  79. package/dist/components/ai/StreamingText/index.js.map +1 -0
  80. package/dist/components/ai/TaskRows/index.d.ts +53 -0
  81. package/dist/components/ai/TaskRows/index.js +186 -0
  82. package/dist/components/ai/TaskRows/index.js.map +1 -0
  83. package/dist/components/ai/Thinking/index.d.ts +47 -0
  84. package/dist/components/ai/Thinking/index.js +197 -0
  85. package/dist/components/ai/Thinking/index.js.map +1 -0
  86. package/dist/components/ai/ToolChips/index.d.ts +21 -0
  87. package/dist/components/ai/ToolChips/index.js +63 -0
  88. package/dist/components/ai/ToolChips/index.js.map +1 -0
  89. package/dist/components/ai/index.d.ts +54 -0
  90. package/dist/components/ai/shared.d.ts +13 -0
  91. package/dist/components/ai/shared.js +25 -0
  92. package/dist/components/ai/shared.js.map +1 -0
  93. package/dist/components/pro/DataTable/rowDetailExtension.js +1 -1
  94. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  95. package/dist/components/pro/Flow/constants.js +3 -3
  96. package/dist/components/pro/Flow/constants.js.map +1 -1
  97. package/dist/components/pro/Flow/nodes/shapes.js +3 -3
  98. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  99. package/dist/components/pro/Flow/utils/themeColor.d.ts +2 -2
  100. package/dist/components/pro/Flow/utils/themeColor.js +2 -2
  101. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  102. package/dist/components/pro/Kanban/Kanban.d.ts +3 -0
  103. package/dist/components/pro/Kanban/Kanban.js +339 -0
  104. package/dist/components/pro/Kanban/Kanban.js.map +1 -0
  105. package/dist/components/pro/Kanban/Swimlanes.d.ts +3 -0
  106. package/dist/components/pro/Kanban/Swimlanes.js +60 -0
  107. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -0
  108. package/dist/components/pro/Kanban/index.d.ts +5 -0
  109. package/dist/components/pro/Kanban/types.d.ts +103 -0
  110. package/dist/components/pro/Kanban/useKanbanDrag.d.ts +17 -0
  111. package/dist/components/pro/Kanban/useKanbanDrag.js +69 -0
  112. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -0
  113. package/dist/components/pro/Kanban/utils.d.ts +13 -0
  114. package/dist/components/pro/Kanban/utils.js +48 -0
  115. package/dist/components/pro/Kanban/utils.js.map +1 -0
  116. package/dist/components/pro/RichTextEditor/AIRewrite.js +158 -127
  117. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  118. package/dist/components/pro/RichTextEditor/BlockHandle.d.ts +2 -0
  119. package/dist/components/pro/RichTextEditor/BlockHandle.js +156 -115
  120. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  121. package/dist/components/pro/RichTextEditor/RichTextEditor.js +136 -159
  122. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  123. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -41
  124. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  125. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +59 -53
  126. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  127. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +48 -44
  128. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  129. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +67 -63
  130. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  131. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.d.ts +1 -0
  132. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +182 -129
  133. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  134. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.d.ts +1 -0
  135. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +3 -3
  136. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  137. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.d.ts +3 -0
  138. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js +31 -0
  139. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -0
  140. package/dist/components/pro/RichTextEditor/index.d.ts +1 -1
  141. package/dist/components/pro/RichTextEditor/types.d.ts +78 -11
  142. package/dist/components/pro/RichTextEditor/types.js +11 -0
  143. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  144. package/dist/dishui.css +1 -1
  145. package/dist/index-nostyled.d.ts +1 -1
  146. package/dist/index.d.ts +6 -3
  147. package/dist/index.js +134 -107
  148. package/dist/kanban.js +5 -0
  149. package/dist/layouts/Sidebar.d.ts +16 -0
  150. package/dist/layouts/Sidebar.js +85 -52
  151. package/dist/layouts/Sidebar.js.map +1 -1
  152. package/dist/utils/i18n.js +20 -0
  153. package/dist/utils/i18n.js.map +1 -1
  154. package/dist/utils/menu.js +1 -1
  155. package/dist/utils/menu.js.map +1 -1
  156. package/package.json +14 -3
@@ -1 +1 @@
1
- {"version":3,"file":"shapes.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/shapes.ts"],"sourcesContent":["import { Graphics } from 'pixi.js';\nimport type { FlowShapeType, FlowNodeData, FlowBorderSides, FlowBorderSideOverride } from '../types';\nimport { drawDashedPath, type PathSeg } from '../utils/dashedLine';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nexport interface ShapeDrawOptions {\n width: number;\n height: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n borderStyle?: 'solid' | 'dashed' | 'dotted' | 'dynamic' | 'none';\n dashOffset?: number;\n}\n\nfunction parseDash(style: string | undefined, strokeWidth: number): number[] | undefined {\n if (!style || style === 'solid') return undefined;\n if (style === 'dynamic') return [strokeWidth * 4, strokeWidth * 3];\n if (style === 'dashed') return [strokeWidth * 4, strokeWidth * 2];\n if (style === 'dotted') return [strokeWidth, strokeWidth * 2];\n return undefined;\n}\n\n/**\n * Sample a rectangle's outline as points for dashed border.\n */\nfunction sampleRect(w: number, h: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let x = 0; x <= w; x += step) pts.push({ x, y: 0 });\n for (let y = step; y <= h; y += step) pts.push({ x: w, y });\n for (let x = w - step; x >= 0; x -= step) pts.push({ x, y: h });\n for (let y = h - step; y > 0; y -= step) pts.push({ x: 0, y });\n pts.push({ x: 0, y: 0 });\n return pts;\n}\n\n/**\n * Sample a rounded rectangle outline as points.\n */\nfunction sampleRoundRect(w: number, h: number, r: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n const cornerSamples = Math.max(4, Math.ceil((Math.PI / 2) * r / step));\n const addCorner = (cx: number, cy: number, startAngle: number) => {\n for (let i = 0; i <= cornerSamples; i++) {\n const a = startAngle + (Math.PI / 2) * (i / cornerSamples);\n pts.push({ x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) });\n }\n };\n addCorner(w - r, r, -Math.PI / 2);\n addCorner(w - r, h - r, 0);\n addCorner(r, h - r, Math.PI / 2);\n addCorner(r, r, Math.PI);\n if (pts.length > 0) pts.push(pts[0]);\n return pts;\n}\n\n/**\n * Sample an ellipse outline.\n */\nfunction sampleEllipse(cx: number, cy: number, rx: number, ry: number, samples = 60): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i <= samples; i++) {\n const a = (Math.PI * 2 * i) / samples;\n pts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return pts;\n}\n\n/**\n * Draw dashed polyline onto graphics.\n */\nfunction drawDashedPoly(g: Graphics, pts: Array<{ x: number; y: number }>, dash: number[], offset: number, color: string, width: number): void {\n if (pts.length < 2) return;\n const dists = [0];\n for (let i = 1; i < pts.length; i++) {\n dists.push(dists[i - 1] + Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y));\n }\n const total = dists[dists.length - 1];\n if (total < 1) return;\n const patternLen = dash[0] + dash[1];\n let pos = -(((offset % patternLen) + patternLen) % patternLen);\n let drawing = true;\n\n const lerp = (d: number) => {\n if (d <= 0) return pts[0];\n if (d >= total) return pts[pts.length - 1];\n let lo = 0, hi = dists.length - 1;\n while (lo < hi - 1) { const m = (lo + hi) >> 1; if (dists[m] <= d) lo = m; else hi = m; }\n const t = dists[hi] - dists[lo] > 0 ? (d - dists[lo]) / (dists[hi] - dists[lo]) : 0;\n return { x: pts[lo].x + (pts[hi].x - pts[lo].x) * t, y: pts[lo].y + (pts[hi].y - pts[lo].y) * t };\n };\n\n while (pos < total) {\n const segLen = drawing ? dash[0] : dash[1];\n const start = Math.max(pos, 0);\n const end = Math.min(pos + segLen, total);\n if (drawing && end > start) {\n const p0 = lerp(start);\n g.moveTo(p0.x, p0.y);\n for (let d = start + 2; d < end; d += 2) {\n const p = lerp(d);\n g.lineTo(p.x, p.y);\n }\n const pe = lerp(end);\n g.lineTo(pe.x, pe.y);\n }\n pos += segLen;\n drawing = !drawing;\n }\n g.stroke({ color, width, cap: 'round' as const });\n}\n\nfunction fillShape(g: Graphics, o: ShapeDrawOptions) {\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill });\n }\n if (o.borderStyle === 'none') return;\n if (o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n // Dashed/dotted/dynamic: don't stroke the shape path, we'll draw dashed separately\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\n/**\n * After fillShape, draw dashed border if needed.\n * Pass shape-specific outline points.\n */\nfunction drawDashedBorder(g: Graphics, o: ShapeDrawOptions, outlinePts: Array<{ x: number; y: number }>) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (!dash || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, outlinePts, dash, offset, o.stroke, o.strokeWidth);\n}\n\n/** Draw only a rounded-rectangle border, without leaving a base path that can\n * be picked up by the dashed stroke. Useful when fill and border are rendered\n * independently, as they are for SVG icon nodes. */\nexport function drawRoundRectBorder(g: Graphics, o: ShapeDrawOptions, radius?: number): void {\n if (o.borderStyle === 'none' || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const r = radius ?? Math.min(12, o.width * 0.1, o.height * 0.1);\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.roundRect(0, 0, o.width, o.height, r).stroke({ color: o.stroke, width: o.strokeWidth });\n }\n}\n\nfunction polyPoints(verts: Array<{ x: number; y: number }>): Array<{ x: number; y: number }> {\n return [...verts, verts[0]];\n}\n\nexport function drawRect(g: Graphics, o: ShapeDrawOptions): void {\n g.rect(0, 0, o.width, o.height);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRect(o.width, o.height));\n}\n\nexport function drawRoundRect(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(12, o.width * 0.1, o.height * 0.1);\n g.roundRect(0, 0, o.width, o.height, r);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRoundRect(o.width, o.height, r));\n}\n\nexport function drawEllipse(g: Graphics, o: ShapeDrawOptions): void {\n g.ellipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleEllipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2));\n}\n\nexport function drawDiamond(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = [{ x: cx, y: 0 }, { x: o.width, y: cy }, { x: cx, y: o.height }, { x: 0, y: cy }];\n g.moveTo(cx, 0).lineTo(o.width, cy).lineTo(cx, o.height).lineTo(0, cy).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawDocument(g: Graphics, o: ShapeDrawOptions): void {\n const w = o.width, h = o.height, curve = h * 0.15;\n g.moveTo(0, 0)\n .lineTo(w, 0)\n .lineTo(w, h - curve)\n .bezierCurveTo(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve)\n .closePath();\n fillShape(g, o);\n const pts: Array<{ x: number; y: number }> = [{ x: 0, y: 0 }, { x: w, y: 0 }, { x: w, y: h - curve }];\n const samples = 20;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const u = 1 - t;\n pts.push({\n x: u * u * u * w + 3 * u * u * t * (w * 0.75) + 3 * u * t * t * (w * 0.25),\n y: u * u * u * (h - curve) + 3 * u * u * t * (h - curve * 2) + 3 * u * t * t * h + t * t * t * (h - curve),\n });\n }\n pts.push({ x: 0, y: 0 });\n drawDashedBorder(g, o, pts);\n}\n\nexport function drawParallelogram(g: Graphics, o: ShapeDrawOptions): void {\n const skew = o.width * 0.2;\n const verts = [{ x: skew, y: 0 }, { x: o.width, y: 0 }, { x: o.width - skew, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(skew, 0).lineTo(o.width, 0).lineTo(o.width - skew, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: o.width / 2, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(o.width / 2, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTrapezoid(g: Graphics, o: ShapeDrawOptions): void {\n const inset = o.width * 0.15;\n const verts = [{ x: inset, y: 0 }, { x: o.width - inset, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(inset, 0).lineTo(o.width - inset, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nfunction regularPoly(cx: number, cy: number, sides: number, rx: number, ry: number, startAngle: number): Array<{ x: number; y: number }> {\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < sides; i++) {\n const a = (Math.PI * 2 * i) / sides + startAngle;\n verts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return verts;\n}\n\nexport function drawPentagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2, r = Math.min(cx, cy);\n const verts = regularPoly(cx, cy, 5, r, r, -Math.PI / 2);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = regularPoly(cx, cy, 6, cx, cy, -Math.PI / 6);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawStar(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.4, points = 5;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagram(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.55;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < 12; i++) {\n const angle = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawRightTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: 0, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(0, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawCorner(g: Graphics, o: ShapeDrawOptions): void {\n const half = Math.min(o.width, o.height) * 0.4;\n const verts = [\n { x: 0, y: 0 }, { x: o.width, y: 0 }, { x: o.width, y: half },\n { x: half, y: half }, { x: half, y: o.height }, { x: 0, y: o.height },\n ];\n g.moveTo(0, 0).lineTo(o.width, 0).lineTo(o.width, half)\n .lineTo(half, half).lineTo(half, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawFlowGroup(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(6, o.width * 0.04, o.height * 0.04);\n g.roundRect(0, 0, o.width, o.height, r);\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill, alpha: 0.08 });\n }\n const border = o.borderStyle ?? 'dashed';\n if (border !== 'none' && o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(border, o.strokeWidth);\n if (dash) {\n const offset = border === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\nexport const drawGeometryGroup = drawFlowGroup;\n\n/* ─── Per-side borders (top / right / bottom / left) ─────────────────── */\n\nexport type BorderSideName = 'top' | 'right' | 'bottom' | 'left';\nexport const BORDER_SIDE_NAMES: BorderSideName[] = ['top', 'right', 'bottom', 'left'];\n\n/** Shape types whose geometry has four well-defined sides. Other shapes ignore\n * `borderSides` and keep a full outline. */\nexport const BORDER_SIDE_TYPES = new Set<string>([\n 'shapeRect', 'shapeRoundRect', 'shapeEllipse', 'shapeDiamond', 'shapeDocument',\n 'shapeParallelogram', 'shapeTrapezoid', 'mediaNode', 'flowGroup', 'geometryGroup',\n]);\n\n/** True when `borderSides` carries at least one effective override AND the\n * shape type supports per-side borders. */\nexport function hasBorderSideOverrides(data: FlowNodeData, type?: string): boolean {\n if (type !== undefined && !BORDER_SIDE_TYPES.has(type)) return false;\n const sides = data.borderSides;\n if (!sides) return false;\n return BORDER_SIDE_NAMES.some((name) => {\n const side = sides[name];\n return !!side\n && (side.visible === false || side.color !== undefined || side.width !== undefined);\n });\n}\n\n/** Corner radius used by each shape's own drawer, so side segments line up\n * exactly with the (possibly hidden) full outline. */\nfunction borderSideRadius(type: string, w: number, h: number): number {\n switch (type) {\n case 'shapeRoundRect': return Math.min(12, w * 0.1, h * 0.1);\n case 'mediaNode': return 6;\n case 'flowGroup':\n case 'geometryGroup': return Math.min(6, w * 0.04, h * 0.04);\n default: return 0;\n }\n}\n\nconst BEZIER_K = 0.5522847498; // kappa for a 90° arc approximation\n\n/** Build the drawable path of one side of the shape. Corners are owned by the\n * side that starts there (clockwise): top owns the top-left arc, right the\n * top-right arc, and so on — with uniform styling the four sides reconstruct\n * the full outline seamlessly. */\nexport function buildBorderSideSegments(\n type: string,\n w: number,\n h: number,\n side: BorderSideName,\n): PathSeg[] {\n const segs: PathSeg[] = [];\n const line = (x: number, y: number) => segs.push({ type: 'L', x, y });\n const cubic = (\n c1x: number, c1y: number, c2x: number, c2y: number, x: number, y: number,\n ) => segs.push({ type: 'C', cp1x: c1x, cp1y: c1y, cp2x: c2x, cp2y: c2y, x, y });\n\n const r = borderSideRadius(type, w, h);\n if (r >= 0.5) {\n // Rounded rect family (shapeRoundRect / mediaNode / group frames): each\n // side owns its starting corner arc (clockwise), so uniform styling\n // reconstructs the full rounded outline seamlessly.\n const k = BEZIER_K * r;\n switch (side) {\n case 'top':\n segs.push({ type: 'M', x: 0, y: r });\n cubic(0, r - k, r - k, 0, r, 0);\n line(w - r, 0);\n break;\n case 'right':\n segs.push({ type: 'M', x: w - r, y: 0 });\n cubic(w - r + k, 0, w, r - k, w, r);\n line(w, h - r);\n break;\n case 'bottom':\n segs.push({ type: 'M', x: w, y: h - r });\n cubic(w, h - r + k, w - r + k, h, w - r, h);\n line(r, h);\n break;\n case 'left':\n segs.push({ type: 'M', x: r, y: h });\n cubic(r - k, h, 0, h - r + k, 0, h - r);\n line(0, r);\n break;\n }\n return segs;\n }\n\n if (type === 'shapeEllipse') {\n // Split the outline at the 45° diagonals so each side is the arc centered\n // on its direction (top arc spans the top, etc.).\n const cx = w / 2, cy = h / 2, rx = w / 2, ry = h / 2;\n const angles: Record<BorderSideName, [number, number]> = {\n top: [Math.PI * 1.25, Math.PI * 1.75],\n right: [Math.PI * 1.75, Math.PI * 2.25],\n bottom: [Math.PI * 0.25, Math.PI * 0.75],\n left: [Math.PI * 0.75, Math.PI * 1.25],\n };\n const [a0, a1] = angles[side];\n const p0x = cx + rx * Math.cos(a0), p0y = cy + ry * Math.sin(a0);\n const p3x = cx + rx * Math.cos(a1), p3y = cy + ry * Math.sin(a1);\n segs.push({ type: 'M', x: p0x, y: p0y });\n cubic(\n p0x - BEZIER_K * rx * Math.sin(a0), p0y + BEZIER_K * ry * Math.cos(a0),\n p3x + BEZIER_K * rx * Math.sin(a1), p3y - BEZIER_K * ry * Math.cos(a1),\n p3x, p3y,\n );\n return segs;\n }\n\n if (type === 'shapeDocument') {\n const curve = h * 0.15;\n if (side === 'top') {\n segs.push({ type: 'M', x: 0, y: 0 });\n line(w, 0);\n } else if (side === 'right') {\n segs.push({ type: 'M', x: w, y: 0 });\n line(w, h - curve);\n } else if (side === 'bottom') {\n segs.push({ type: 'M', x: w, y: h - curve });\n cubic(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve);\n } else {\n segs.push({ type: 'M', x: 0, y: h - curve });\n line(0, 0);\n }\n return segs;\n }\n\n // Quadrilaterals (rect / diamond / parallelogram / trapezoid).\n let v0: { x: number; y: number }, v1: { x: number; y: number }, v2: { x: number; y: number }, v3: { x: number; y: number };\n if (type === 'shapeDiamond') {\n const cx = w / 2, cy = h / 2;\n v0 = { x: cx, y: 0 }; v1 = { x: w, y: cy }; v2 = { x: cx, y: h }; v3 = { x: 0, y: cy };\n } else if (type === 'shapeParallelogram') {\n const skew = w * 0.2;\n v0 = { x: skew, y: 0 }; v1 = { x: w, y: 0 }; v2 = { x: w - skew, y: h }; v3 = { x: 0, y: h };\n } else if (type === 'shapeTrapezoid') {\n const inset = w * 0.15;\n v0 = { x: inset, y: 0 }; v1 = { x: w - inset, y: 0 }; v2 = { x: w, y: h }; v3 = { x: 0, y: h };\n } else {\n v0 = { x: 0, y: 0 }; v1 = { x: w, y: 0 }; v2 = { x: w, y: h }; v3 = { x: 0, y: h };\n }\n\n const edges: Record<BorderSideName, [{ x: number; y: number }, { x: number; y: number }]> = {\n top: [v0, v1],\n right: [v1, v2],\n bottom: [v2, v3],\n left: [v3, v0],\n };\n const [a, b] = edges[side];\n segs.push({ type: 'M', x: a.x, y: a.y });\n line(b.x, b.y);\n return segs;\n}\n\n/** Draw the four sides of a node independently, honoring per-side color /\n * width / visibility overrides (falling back to the node's defaults). The\n * node's `borderStyle` (solid / dashed / dotted / dynamic) applies to every\n * side. `defaultColor` is the node's (already theme-resolved) stroke. */\nexport function drawBorderSides(\n g: Graphics,\n type: string,\n width: number,\n height: number,\n sides: FlowBorderSides | undefined,\n defaultColor: string,\n defaultWidth: number,\n borderStyle: string | undefined,\n dashOffset: number,\n): void {\n if (borderStyle === 'none') return;\n for (const name of BORDER_SIDE_NAMES) {\n const side: FlowBorderSideOverride | undefined = sides?.[name];\n if (side?.visible === false) continue;\n const color = resolveThemeColor(side?.color, defaultColor) || defaultColor;\n const strokeWidth = side?.width ?? defaultWidth;\n if (!color || color === 'transparent' || !(strokeWidth > 0)) continue;\n const segs = buildBorderSideSegments(type, width, height, name);\n const dash = parseDash(borderStyle, strokeWidth);\n if (dash) {\n const offset = borderStyle === 'dynamic' ? dashOffset : 0;\n drawDashedPath(g, segs, dash, offset);\n g.stroke({ color, width: strokeWidth, cap: 'round' as const });\n } else {\n for (const seg of segs) {\n switch (seg.type) {\n case 'M': g.moveTo(seg.x, seg.y); break;\n case 'L': g.lineTo(seg.x, seg.y); break;\n case 'C': g.bezierCurveTo(seg.cp1x!, seg.cp1y!, seg.cp2x!, seg.cp2y!, seg.x, seg.y); break;\n case 'Q': g.quadraticCurveTo(seg.cp1x!, seg.cp1y!, seg.x, seg.y); break;\n }\n }\n g.stroke({ color, width: strokeWidth });\n }\n }\n}\n\n/** Lookup table mapping shape type to draw function */\nexport const shapeDrawers: Record<string, (g: Graphics, o: ShapeDrawOptions) => void> = {\n shapeRect: drawRect,\n shapeRoundRect: drawRoundRect,\n shapeEllipse: drawEllipse,\n shapeDiamond: drawDiamond,\n shapeDocument: drawDocument,\n shapeParallelogram: drawParallelogram,\n shapeTriangle: drawTriangle,\n shapeTrapezoid: drawTrapezoid,\n shapePentagon: drawPentagon,\n shapeHexagon: drawHexagon,\n shapeStar: drawStar,\n shapeHexagram: drawHexagram,\n shapeRightTriangle: drawRightTriangle,\n shapeCorner: drawCorner,\n textLabel: drawRect,\n flowGroup: drawFlowGroup,\n geometryGroup: drawGeometryGroup,\n shapeSvg: drawRoundRect,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"shapes.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/shapes.ts"],"sourcesContent":["import { Graphics } from 'pixi.js';\nimport type { FlowShapeType, FlowNodeData, FlowBorderSides, FlowBorderSideOverride } from '../types';\nimport { drawDashedPath, type PathSeg } from '../utils/dashedLine';\nimport { resolveThemeColor } from '../utils/themeColor';\n\nexport interface ShapeDrawOptions {\n width: number;\n height: number;\n fill: string;\n stroke: string;\n strokeWidth: number;\n borderStyle?: 'solid' | 'dashed' | 'dotted' | 'dynamic' | 'none';\n dashOffset?: number;\n}\n\nfunction parseDash(style: string | undefined, strokeWidth: number): number[] | undefined {\n if (!style || style === 'solid') return undefined;\n if (style === 'dynamic') return [strokeWidth * 4, strokeWidth * 3];\n if (style === 'dashed') return [strokeWidth * 4, strokeWidth * 2];\n if (style === 'dotted') return [strokeWidth, strokeWidth * 2];\n return undefined;\n}\n\n/**\n * Sample a rectangle's outline as points for dashed border.\n */\nfunction sampleRect(w: number, h: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let x = 0; x <= w; x += step) pts.push({ x, y: 0 });\n for (let y = step; y <= h; y += step) pts.push({ x: w, y });\n for (let x = w - step; x >= 0; x -= step) pts.push({ x, y: h });\n for (let y = h - step; y > 0; y -= step) pts.push({ x: 0, y });\n pts.push({ x: 0, y: 0 });\n return pts;\n}\n\n/**\n * Sample a rounded rectangle outline as points.\n */\nfunction sampleRoundRect(w: number, h: number, r: number, step = 3): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n const cornerSamples = Math.max(4, Math.ceil((Math.PI / 2) * r / step));\n const addCorner = (cx: number, cy: number, startAngle: number) => {\n for (let i = 0; i <= cornerSamples; i++) {\n const a = startAngle + (Math.PI / 2) * (i / cornerSamples);\n pts.push({ x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) });\n }\n };\n addCorner(w - r, r, -Math.PI / 2);\n addCorner(w - r, h - r, 0);\n addCorner(r, h - r, Math.PI / 2);\n addCorner(r, r, Math.PI);\n if (pts.length > 0) pts.push(pts[0]);\n return pts;\n}\n\n/**\n * Sample an ellipse outline.\n */\nfunction sampleEllipse(cx: number, cy: number, rx: number, ry: number, samples = 60): Array<{ x: number; y: number }> {\n const pts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i <= samples; i++) {\n const a = (Math.PI * 2 * i) / samples;\n pts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return pts;\n}\n\n/**\n * Draw dashed polyline onto graphics.\n */\nfunction drawDashedPoly(g: Graphics, pts: Array<{ x: number; y: number }>, dash: number[], offset: number, color: string, width: number): void {\n if (pts.length < 2) return;\n const dists = [0];\n for (let i = 1; i < pts.length; i++) {\n dists.push(dists[i - 1] + Math.hypot(pts[i].x - pts[i - 1].x, pts[i].y - pts[i - 1].y));\n }\n const total = dists[dists.length - 1];\n if (total < 1) return;\n const patternLen = dash[0] + dash[1];\n let pos = -(((offset % patternLen) + patternLen) % patternLen);\n let drawing = true;\n\n const lerp = (d: number) => {\n if (d <= 0) return pts[0];\n if (d >= total) return pts[pts.length - 1];\n let lo = 0, hi = dists.length - 1;\n while (lo < hi - 1) { const m = (lo + hi) >> 1; if (dists[m] <= d) lo = m; else hi = m; }\n const t = dists[hi] - dists[lo] > 0 ? (d - dists[lo]) / (dists[hi] - dists[lo]) : 0;\n return { x: pts[lo].x + (pts[hi].x - pts[lo].x) * t, y: pts[lo].y + (pts[hi].y - pts[lo].y) * t };\n };\n\n while (pos < total) {\n const segLen = drawing ? dash[0] : dash[1];\n const start = Math.max(pos, 0);\n const end = Math.min(pos + segLen, total);\n if (drawing && end > start) {\n const p0 = lerp(start);\n g.moveTo(p0.x, p0.y);\n for (let d = start + 2; d < end; d += 2) {\n const p = lerp(d);\n g.lineTo(p.x, p.y);\n }\n const pe = lerp(end);\n g.lineTo(pe.x, pe.y);\n }\n pos += segLen;\n drawing = !drawing;\n }\n g.stroke({ color, width, cap: 'round' as const });\n}\n\nfunction fillShape(g: Graphics, o: ShapeDrawOptions) {\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill });\n }\n if (o.borderStyle === 'none') return;\n if (o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n // Dashed/dotted/dynamic: don't stroke the shape path, we'll draw dashed separately\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\n/**\n * After fillShape, draw dashed border if needed.\n * Pass shape-specific outline points.\n */\nfunction drawDashedBorder(g: Graphics, o: ShapeDrawOptions, outlinePts: Array<{ x: number; y: number }>) {\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (!dash || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, outlinePts, dash, offset, o.stroke, o.strokeWidth);\n}\n\n/** Draw only a rounded-rectangle border, without leaving a base path that can\n * be picked up by the dashed stroke. Useful when fill and border are rendered\n * independently, as they are for SVG icon nodes. */\nexport function drawRoundRectBorder(g: Graphics, o: ShapeDrawOptions, radius?: number): void {\n if (o.borderStyle === 'none' || !o.stroke || o.stroke === 'transparent' || o.strokeWidth <= 0) return;\n const r = radius ?? Math.min(14, o.width * 0.1, o.height * 0.1);\n const dash = parseDash(o.borderStyle, o.strokeWidth);\n if (dash) {\n const offset = o.borderStyle === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.roundRect(0, 0, o.width, o.height, r).stroke({ color: o.stroke, width: o.strokeWidth });\n }\n}\n\nfunction polyPoints(verts: Array<{ x: number; y: number }>): Array<{ x: number; y: number }> {\n return [...verts, verts[0]];\n}\n\nexport function drawRect(g: Graphics, o: ShapeDrawOptions): void {\n g.rect(0, 0, o.width, o.height);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRect(o.width, o.height));\n}\n\nexport function drawRoundRect(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(14, o.width * 0.1, o.height * 0.1);\n g.roundRect(0, 0, o.width, o.height, r);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleRoundRect(o.width, o.height, r));\n}\n\nexport function drawEllipse(g: Graphics, o: ShapeDrawOptions): void {\n g.ellipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2);\n fillShape(g, o);\n drawDashedBorder(g, o, sampleEllipse(o.width / 2, o.height / 2, o.width / 2, o.height / 2));\n}\n\nexport function drawDiamond(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = [{ x: cx, y: 0 }, { x: o.width, y: cy }, { x: cx, y: o.height }, { x: 0, y: cy }];\n g.moveTo(cx, 0).lineTo(o.width, cy).lineTo(cx, o.height).lineTo(0, cy).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawDocument(g: Graphics, o: ShapeDrawOptions): void {\n const w = o.width, h = o.height, curve = h * 0.15;\n g.moveTo(0, 0)\n .lineTo(w, 0)\n .lineTo(w, h - curve)\n .bezierCurveTo(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve)\n .closePath();\n fillShape(g, o);\n const pts: Array<{ x: number; y: number }> = [{ x: 0, y: 0 }, { x: w, y: 0 }, { x: w, y: h - curve }];\n const samples = 20;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const u = 1 - t;\n pts.push({\n x: u * u * u * w + 3 * u * u * t * (w * 0.75) + 3 * u * t * t * (w * 0.25),\n y: u * u * u * (h - curve) + 3 * u * u * t * (h - curve * 2) + 3 * u * t * t * h + t * t * t * (h - curve),\n });\n }\n pts.push({ x: 0, y: 0 });\n drawDashedBorder(g, o, pts);\n}\n\nexport function drawParallelogram(g: Graphics, o: ShapeDrawOptions): void {\n const skew = o.width * 0.2;\n const verts = [{ x: skew, y: 0 }, { x: o.width, y: 0 }, { x: o.width - skew, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(skew, 0).lineTo(o.width, 0).lineTo(o.width - skew, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: o.width / 2, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(o.width / 2, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawTrapezoid(g: Graphics, o: ShapeDrawOptions): void {\n const inset = o.width * 0.15;\n const verts = [{ x: inset, y: 0 }, { x: o.width - inset, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(inset, 0).lineTo(o.width - inset, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nfunction regularPoly(cx: number, cy: number, sides: number, rx: number, ry: number, startAngle: number): Array<{ x: number; y: number }> {\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < sides; i++) {\n const a = (Math.PI * 2 * i) / sides + startAngle;\n verts.push({ x: cx + rx * Math.cos(a), y: cy + ry * Math.sin(a) });\n }\n return verts;\n}\n\nexport function drawPentagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2, r = Math.min(cx, cy);\n const verts = regularPoly(cx, cy, 5, r, r, -Math.PI / 2);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagon(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const verts = regularPoly(cx, cy, 6, cx, cy, -Math.PI / 6);\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawStar(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.4, points = 5;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawHexagram(g: Graphics, o: ShapeDrawOptions): void {\n const cx = o.width / 2, cy = o.height / 2;\n const outer = Math.min(cx, cy), inner = outer * 0.55;\n const verts: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < 12; i++) {\n const angle = (Math.PI * i) / 6 - Math.PI / 2;\n const r = i % 2 === 0 ? outer : inner;\n verts.push({ x: cx + r * Math.cos(angle), y: cy + r * Math.sin(angle) });\n }\n for (let i = 0; i < verts.length; i++) {\n if (i === 0) g.moveTo(verts[i].x, verts[i].y); else g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawRightTriangle(g: Graphics, o: ShapeDrawOptions): void {\n const verts = [{ x: 0, y: 0 }, { x: o.width, y: o.height }, { x: 0, y: o.height }];\n g.moveTo(0, 0).lineTo(o.width, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawCorner(g: Graphics, o: ShapeDrawOptions): void {\n const half = Math.min(o.width, o.height) * 0.4;\n const verts = [\n { x: 0, y: 0 }, { x: o.width, y: 0 }, { x: o.width, y: half },\n { x: half, y: half }, { x: half, y: o.height }, { x: 0, y: o.height },\n ];\n g.moveTo(0, 0).lineTo(o.width, 0).lineTo(o.width, half)\n .lineTo(half, half).lineTo(half, o.height).lineTo(0, o.height).closePath();\n fillShape(g, o);\n drawDashedBorder(g, o, polyPoints(verts));\n}\n\nexport function drawFlowGroup(g: Graphics, o: ShapeDrawOptions): void {\n const r = Math.min(6, o.width * 0.04, o.height * 0.04);\n g.roundRect(0, 0, o.width, o.height, r);\n if (o.fill && o.fill !== 'transparent') {\n g.fill({ color: o.fill, alpha: 0.08 });\n }\n const border = o.borderStyle ?? 'dashed';\n if (border !== 'none' && o.stroke && o.stroke !== 'transparent' && o.strokeWidth > 0) {\n const dash = parseDash(border, o.strokeWidth);\n if (dash) {\n const offset = border === 'dynamic' ? (o.dashOffset ?? 0) : 0;\n drawDashedPoly(g, sampleRoundRect(o.width, o.height, r), dash, offset, o.stroke, o.strokeWidth);\n } else {\n g.stroke({ color: o.stroke, width: o.strokeWidth });\n }\n }\n}\n\nexport const drawGeometryGroup = drawFlowGroup;\n\n/* ─── Per-side borders (top / right / bottom / left) ─────────────────── */\n\nexport type BorderSideName = 'top' | 'right' | 'bottom' | 'left';\nexport const BORDER_SIDE_NAMES: BorderSideName[] = ['top', 'right', 'bottom', 'left'];\n\n/** Shape types whose geometry has four well-defined sides. Other shapes ignore\n * `borderSides` and keep a full outline. */\nexport const BORDER_SIDE_TYPES = new Set<string>([\n 'shapeRect', 'shapeRoundRect', 'shapeEllipse', 'shapeDiamond', 'shapeDocument',\n 'shapeParallelogram', 'shapeTrapezoid', 'mediaNode', 'flowGroup', 'geometryGroup',\n]);\n\n/** True when `borderSides` carries at least one effective override AND the\n * shape type supports per-side borders. */\nexport function hasBorderSideOverrides(data: FlowNodeData, type?: string): boolean {\n if (type !== undefined && !BORDER_SIDE_TYPES.has(type)) return false;\n const sides = data.borderSides;\n if (!sides) return false;\n return BORDER_SIDE_NAMES.some((name) => {\n const side = sides[name];\n return !!side\n && (side.visible === false || side.color !== undefined || side.width !== undefined);\n });\n}\n\n/** Corner radius used by each shape's own drawer, so side segments line up\n * exactly with the (possibly hidden) full outline. */\nfunction borderSideRadius(type: string, w: number, h: number): number {\n switch (type) {\n case 'shapeRoundRect': return Math.min(14, w * 0.1, h * 0.1);\n case 'mediaNode': return 6;\n case 'flowGroup':\n case 'geometryGroup': return Math.min(6, w * 0.04, h * 0.04);\n default: return 0;\n }\n}\n\nconst BEZIER_K = 0.5522847498; // kappa for a 90° arc approximation\n\n/** Build the drawable path of one side of the shape. Corners are owned by the\n * side that starts there (clockwise): top owns the top-left arc, right the\n * top-right arc, and so on — with uniform styling the four sides reconstruct\n * the full outline seamlessly. */\nexport function buildBorderSideSegments(\n type: string,\n w: number,\n h: number,\n side: BorderSideName,\n): PathSeg[] {\n const segs: PathSeg[] = [];\n const line = (x: number, y: number) => segs.push({ type: 'L', x, y });\n const cubic = (\n c1x: number, c1y: number, c2x: number, c2y: number, x: number, y: number,\n ) => segs.push({ type: 'C', cp1x: c1x, cp1y: c1y, cp2x: c2x, cp2y: c2y, x, y });\n\n const r = borderSideRadius(type, w, h);\n if (r >= 0.5) {\n // Rounded rect family (shapeRoundRect / mediaNode / group frames): each\n // side owns its starting corner arc (clockwise), so uniform styling\n // reconstructs the full rounded outline seamlessly.\n const k = BEZIER_K * r;\n switch (side) {\n case 'top':\n segs.push({ type: 'M', x: 0, y: r });\n cubic(0, r - k, r - k, 0, r, 0);\n line(w - r, 0);\n break;\n case 'right':\n segs.push({ type: 'M', x: w - r, y: 0 });\n cubic(w - r + k, 0, w, r - k, w, r);\n line(w, h - r);\n break;\n case 'bottom':\n segs.push({ type: 'M', x: w, y: h - r });\n cubic(w, h - r + k, w - r + k, h, w - r, h);\n line(r, h);\n break;\n case 'left':\n segs.push({ type: 'M', x: r, y: h });\n cubic(r - k, h, 0, h - r + k, 0, h - r);\n line(0, r);\n break;\n }\n return segs;\n }\n\n if (type === 'shapeEllipse') {\n // Split the outline at the 45° diagonals so each side is the arc centered\n // on its direction (top arc spans the top, etc.).\n const cx = w / 2, cy = h / 2, rx = w / 2, ry = h / 2;\n const angles: Record<BorderSideName, [number, number]> = {\n top: [Math.PI * 1.25, Math.PI * 1.75],\n right: [Math.PI * 1.75, Math.PI * 2.25],\n bottom: [Math.PI * 0.25, Math.PI * 0.75],\n left: [Math.PI * 0.75, Math.PI * 1.25],\n };\n const [a0, a1] = angles[side];\n const p0x = cx + rx * Math.cos(a0), p0y = cy + ry * Math.sin(a0);\n const p3x = cx + rx * Math.cos(a1), p3y = cy + ry * Math.sin(a1);\n segs.push({ type: 'M', x: p0x, y: p0y });\n cubic(\n p0x - BEZIER_K * rx * Math.sin(a0), p0y + BEZIER_K * ry * Math.cos(a0),\n p3x + BEZIER_K * rx * Math.sin(a1), p3y - BEZIER_K * ry * Math.cos(a1),\n p3x, p3y,\n );\n return segs;\n }\n\n if (type === 'shapeDocument') {\n const curve = h * 0.15;\n if (side === 'top') {\n segs.push({ type: 'M', x: 0, y: 0 });\n line(w, 0);\n } else if (side === 'right') {\n segs.push({ type: 'M', x: w, y: 0 });\n line(w, h - curve);\n } else if (side === 'bottom') {\n segs.push({ type: 'M', x: w, y: h - curve });\n cubic(w * 0.75, h - curve * 2, w * 0.25, h, 0, h - curve);\n } else {\n segs.push({ type: 'M', x: 0, y: h - curve });\n line(0, 0);\n }\n return segs;\n }\n\n // Quadrilaterals (rect / diamond / parallelogram / trapezoid).\n let v0: { x: number; y: number }, v1: { x: number; y: number }, v2: { x: number; y: number }, v3: { x: number; y: number };\n if (type === 'shapeDiamond') {\n const cx = w / 2, cy = h / 2;\n v0 = { x: cx, y: 0 }; v1 = { x: w, y: cy }; v2 = { x: cx, y: h }; v3 = { x: 0, y: cy };\n } else if (type === 'shapeParallelogram') {\n const skew = w * 0.2;\n v0 = { x: skew, y: 0 }; v1 = { x: w, y: 0 }; v2 = { x: w - skew, y: h }; v3 = { x: 0, y: h };\n } else if (type === 'shapeTrapezoid') {\n const inset = w * 0.15;\n v0 = { x: inset, y: 0 }; v1 = { x: w - inset, y: 0 }; v2 = { x: w, y: h }; v3 = { x: 0, y: h };\n } else {\n v0 = { x: 0, y: 0 }; v1 = { x: w, y: 0 }; v2 = { x: w, y: h }; v3 = { x: 0, y: h };\n }\n\n const edges: Record<BorderSideName, [{ x: number; y: number }, { x: number; y: number }]> = {\n top: [v0, v1],\n right: [v1, v2],\n bottom: [v2, v3],\n left: [v3, v0],\n };\n const [a, b] = edges[side];\n segs.push({ type: 'M', x: a.x, y: a.y });\n line(b.x, b.y);\n return segs;\n}\n\n/** Draw the four sides of a node independently, honoring per-side color /\n * width / visibility overrides (falling back to the node's defaults). The\n * node's `borderStyle` (solid / dashed / dotted / dynamic) applies to every\n * side. `defaultColor` is the node's (already theme-resolved) stroke. */\nexport function drawBorderSides(\n g: Graphics,\n type: string,\n width: number,\n height: number,\n sides: FlowBorderSides | undefined,\n defaultColor: string,\n defaultWidth: number,\n borderStyle: string | undefined,\n dashOffset: number,\n): void {\n if (borderStyle === 'none') return;\n for (const name of BORDER_SIDE_NAMES) {\n const side: FlowBorderSideOverride | undefined = sides?.[name];\n if (side?.visible === false) continue;\n const color = resolveThemeColor(side?.color, defaultColor) || defaultColor;\n const strokeWidth = side?.width ?? defaultWidth;\n if (!color || color === 'transparent' || !(strokeWidth > 0)) continue;\n const segs = buildBorderSideSegments(type, width, height, name);\n const dash = parseDash(borderStyle, strokeWidth);\n if (dash) {\n const offset = borderStyle === 'dynamic' ? dashOffset : 0;\n drawDashedPath(g, segs, dash, offset);\n g.stroke({ color, width: strokeWidth, cap: 'round' as const });\n } else {\n for (const seg of segs) {\n switch (seg.type) {\n case 'M': g.moveTo(seg.x, seg.y); break;\n case 'L': g.lineTo(seg.x, seg.y); break;\n case 'C': g.bezierCurveTo(seg.cp1x!, seg.cp1y!, seg.cp2x!, seg.cp2y!, seg.x, seg.y); break;\n case 'Q': g.quadraticCurveTo(seg.cp1x!, seg.cp1y!, seg.x, seg.y); break;\n }\n }\n g.stroke({ color, width: strokeWidth });\n }\n }\n}\n\n/** Lookup table mapping shape type to draw function */\nexport const shapeDrawers: Record<string, (g: Graphics, o: ShapeDrawOptions) => void> = {\n shapeRect: drawRect,\n shapeRoundRect: drawRoundRect,\n shapeEllipse: drawEllipse,\n shapeDiamond: drawDiamond,\n shapeDocument: drawDocument,\n shapeParallelogram: drawParallelogram,\n shapeTriangle: drawTriangle,\n shapeTrapezoid: drawTrapezoid,\n shapePentagon: drawPentagon,\n shapeHexagon: drawHexagon,\n shapeStar: drawStar,\n shapeHexagram: drawHexagram,\n shapeRightTriangle: drawRightTriangle,\n shapeCorner: drawCorner,\n textLabel: drawRect,\n flowGroup: drawFlowGroup,\n geometryGroup: drawGeometryGroup,\n shapeSvg: drawRoundRect,\n};\n"],"mappings":"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"}
@@ -47,9 +47,9 @@ export declare const THEME_COLOR_TOKENS: ThemeColorToken[];
47
47
  * The "follow theme" default token for each color field type. Each field syncs
48
48
  * to a theme role so shapes stay legible against the canvas:
49
49
  * - `fill` -> theme background (base-100)
50
- * - `stroke` -> theme font color (base-content) — a visible outline
50
+ * - `stroke` -> theme hairline (base-300) — a calm, low-contrast outline
51
51
  * - `text` -> theme font color (base-content)
52
- * - `line` -> theme font color (base-content) — lines/edges
52
+ * - `line` -> theme hairline (base-300) — lines/edges
53
53
  */
54
54
  export type ThemeColorFieldKind = 'fill' | 'stroke' | 'text' | 'line';
55
55
  export declare const THEME_SYNC_TOKEN: Record<ThemeColorFieldKind, string>;
@@ -134,9 +134,9 @@ var u = "theme:", d = [
134
134
  new Map(d.map((e) => [e.token, e.label]));
135
135
  var p = {
136
136
  fill: "theme:base-100",
137
- stroke: "theme:base-content",
137
+ stroke: "theme:base-300",
138
138
  text: "theme:base-content",
139
- line: "theme:base-content"
139
+ line: "theme:base-300"
140
140
  };
141
141
  function m(e) {
142
142
  return f.get(e);
@@ -1 +1 @@
1
- {"version":3,"file":"themeColor.js","names":[],"sources":["../../../../../src/components/pro/Flow/utils/themeColor.ts"],"sourcesContent":["/**\n * Resolve a CSS color value (including theme custom properties like\n * `var(--color-base-100)` that may use `oklch(...)`) into a concrete sRGB color\n * for the WebGL canvas.\n *\n * PixiJS needs a numeric/hex color and cannot read CSS variables. Resolution:\n * 1. A hidden probe element inherits the themed scope. Its `color` is set to\n * `color-mix(in srgb, <value> 100%, transparent)`, which forces the\n * browser to convert the color into the sRGB space at computed-value\n * time. `getComputedStyle` then serializes it as a plain `rgb(...)` or\n * `color(srgb ...)` string.\n * 2. That string is parsed directly (no canvas). Canvas rasterization is\n * only a last resort: some engines silently reject CSS Color 4 functions\n * (`oklch()`, `lab()`, `color()`) in `fillStyle`, which previously turned\n * every probed theme color black.\n */\n\nlet _rasterCtx: CanvasRenderingContext2D | null = null;\nfunction getRasterCtx(): CanvasRenderingContext2D | null {\n if (_rasterCtx) return _rasterCtx;\n if (typeof document === 'undefined') return null;\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n _rasterCtx = canvas.getContext('2d', { willReadFrequently: true });\n return _rasterCtx;\n}\n\n/** Rasterize any CSS color string to concrete sRGB bytes. */\nfunction rasterizeColor(cssColor: string): [number, number, number] | null {\n const ctx = getRasterCtx();\n if (!ctx) return null;\n try {\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = '#000000';\n ctx.fillStyle = cssColor; // ignored if the browser can't parse it\n ctx.fillRect(0, 0, 1, 1);\n const { data } = ctx.getImageData(0, 0, 1, 1);\n return [data[0], data[1], data[2]];\n } catch {\n return null;\n }\n}\n\nfunction byte(v: number): number {\n return Math.max(0, Math.min(255, Math.round(v)));\n}\n\n/**\n * Parse the sRGB strings a browser serializes a computed color to when the\n * color was forced into the sRGB space: `rgb(...)` / `rgba(...)` (0-255\n * channels) or `color(srgb r g b / a)` (0-1 float channels).\n */\nfunction parseSrgbString(value: string): [number, number, number] | null {\n const rgb = /^rgba?\\(\\s*([\\d.eE+-]+)[\\s,]+([\\d.eE+-]+)[\\s,]+([\\d.eE+-]+)/.exec(value);\n if (rgb) return [byte(+rgb[1]), byte(+rgb[2]), byte(+rgb[3])];\n const fn = /^color\\(\\s*srgb\\s+([\\d.eE+-]+)\\s+([\\d.eE+-]+)\\s+([\\d.eE+-]+)/i.exec(value);\n if (fn) return [byte(+fn[1] * 255), byte(+fn[2] * 255), byte(+fn[3] * 255)];\n return null;\n}\n\n/** Whether the browser computes color-mix() (used to force sRGB output). */\nconst SUPPORTS_COLOR_MIX =\n typeof CSS !== 'undefined' &&\n typeof CSS.supports === 'function' &&\n CSS.supports('color', 'color-mix(in srgb, red, blue)');\n\nfunction parseRgb(host: HTMLElement | null, cssValue: string): [number, number, number] | null {\n if (typeof document === 'undefined') return null;\n try {\n const probe = document.createElement('span');\n // Keep out of layout without `display:none` so `color` still resolves.\n probe.style.position = 'absolute';\n probe.style.width = '0';\n probe.style.height = '0';\n probe.style.overflow = 'hidden';\n probe.style.pointerEvents = 'none';\n (host ?? document.body).appendChild(probe);\n // Bail out when the requested custom property is undefined in this scope:\n // var() would invalidate the declaration and the probe would report its\n // inherited text color instead of the theme color.\n const varMatch = /^var\\(\\s*(--[\\w-]+)\\s*\\)$/.exec(cssValue);\n if (varMatch && !getComputedStyle(probe).getPropertyValue(varMatch[1]).trim()) {\n probe.remove();\n return null;\n }\n // Force the resolved color into the sRGB space at computed-value time, so\n // the serialized result is a plain rgb()/color(srgb) string we can parse\n // ourselves. Do NOT rasterize oklch()/lab() via canvas fillStyle here:\n // some engines (e.g. WebKit) silently reject CSS Color 4 functions in\n // canvas, which used to turn every probed theme color black.\n probe.style.color = SUPPORTS_COLOR_MIX\n ? `color-mix(in srgb, ${cssValue} 100%, transparent)`\n : cssValue;\n const resolved = getComputedStyle(probe).color;\n probe.remove();\n return parseSrgbString(resolved) ?? rasterizeColor(resolved);\n } catch {\n return null;\n }\n}\n\n/** Resolve a CSS color to a 0xRRGGBB number (for PixiJS). */\nexport function cssColorToNumber(host: HTMLElement | null, cssValue: string, fallback: number): number {\n const rgb = parseRgb(host, cssValue);\n if (!rgb) return fallback;\n return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n}\n\n/** Resolve a CSS color to a `#rrggbb` string (for persisted node data). */\nexport function cssColorToHexString(host: HTMLElement | null, cssValue: string, fallback: string): string {\n const rgb = parseRgb(host, cssValue);\n if (!rgb) return fallback;\n return '#' + rgb.map((c) => c.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * The colors the Flow canvas derives from the active theme:\n * - `background`: the canvas backdrop, follows the theme's muted background.\n * - `gridDot`: grid dots, derived from the theme foreground color.\n * - `nodeFill`: default fill for new shapes, follows the theme base background.\n */\nexport interface FlowThemeColors {\n background: number;\n gridDot: number;\n nodeFill: string;\n nodeText: string;\n}\n\nexport function resolveFlowThemeColors(host: HTMLElement | null): FlowThemeColors {\n return {\n background: cssColorToNumber(host, 'var(--color-base-200)', 0xf8f9fa),\n gridDot: cssColorToNumber(host, 'var(--color-base-content)', 0xd1d5db),\n nodeFill: cssColorToHexString(host, 'var(--color-base-100)', '#ffffff'),\n nodeText: cssColorToHexString(host, 'var(--color-base-content)', '#111827'),\n };\n}\n\n/* ============================================================================\n * Theme color tokens\n *\n * Node/edge colors may be stored either as a literal color (`#rrggbb`,\n * `transparent`, …) or as a THEME TOKEN of the form `theme:<name>` (e.g.\n * `theme:base-100`). Theme tokens are resolved to the live theme color at\n * render time, so shapes that use them re-color automatically whenever the\n * DishUI theme changes. These tokens are the default colors for new shapes.\n * ========================================================================== */\n\nexport const THEME_COLOR_PREFIX = 'theme:';\n\n/** A selectable theme color, shown as a swatch in the inspector. */\nexport interface ThemeColorToken {\n /** Stored value, e.g. `theme:base-100`. */\n token: string;\n /** CSS custom property backing the token. */\n cssVar: string;\n /** Short label for the inspector tooltip. */\n label: string;\n}\n\n/** The theme colors offered as presets/defaults for Flow color fields. */\nexport const THEME_COLOR_TOKENS: ThemeColorToken[] = [\n { token: 'theme:base-100', cssVar: 'var(--color-base-100)', label: 'Base 100' },\n { token: 'theme:base-200', cssVar: 'var(--color-base-200)', label: 'Base 200' },\n { token: 'theme:base-300', cssVar: 'var(--color-base-300)', label: 'Base 300' },\n { token: 'theme:base-content', cssVar: 'var(--color-base-content)', label: 'Base Content' },\n { token: 'theme:primary', cssVar: 'var(--color-primary)', label: 'Primary' },\n { token: 'theme:secondary', cssVar: 'var(--color-secondary)', label: 'Secondary' },\n { token: 'theme:accent', cssVar: 'var(--color-accent)', label: 'Accent' },\n { token: 'theme:neutral', cssVar: 'var(--color-neutral)', label: 'Neutral' },\n { token: 'theme:info', cssVar: 'var(--color-info)', label: 'Info' },\n { token: 'theme:success', cssVar: 'var(--color-success)', label: 'Success' },\n { token: 'theme:warning', cssVar: 'var(--color-warning)', label: 'Warning' },\n { token: 'theme:error', cssVar: 'var(--color-error)', label: 'Error' },\n];\n\nconst TOKEN_TO_CSSVAR = new Map(THEME_COLOR_TOKENS.map((t) => [t.token, t.cssVar]));\nconst TOKEN_TO_LABEL = new Map(THEME_COLOR_TOKENS.map((t) => [t.token, t.label]));\n\n/**\n * The \"follow theme\" default token for each color field type. Each field syncs\n * to a theme role so shapes stay legible against the canvas:\n * - `fill` -> theme background (base-100)\n * - `stroke` -> theme font color (base-content) — a visible outline\n * - `text` -> theme font color (base-content)\n * - `line` -> theme font color (base-content) — lines/edges\n */\nexport type ThemeColorFieldKind = 'fill' | 'stroke' | 'text' | 'line';\n\nexport const THEME_SYNC_TOKEN: Record<ThemeColorFieldKind, string> = {\n fill: 'theme:base-100',\n stroke: 'theme:base-content',\n text: 'theme:base-content',\n line: 'theme:base-content',\n};\n\n/** The CSS var backing a given theme token (for live-updating DOM swatches). */\nexport function themeTokenCssVar(token: string): string | undefined {\n return TOKEN_TO_CSSVAR.get(token);\n}\n\n/** Human label for a theme token (for tooltips). */\nexport function themeTokenLabel(token: string): string | undefined {\n return TOKEN_TO_LABEL.get(token);\n}\n\n/**\n * Common named colors offered after the theme-sync swatch: a compact rainbow\n * plus black/white. Order follows 黑白赤橙黄绿青蓝紫粉 (black, white, red,\n * orange, yellow, green, cyan, blue, purple, pink).\n */\nexport interface NamedColor {\n value: string;\n /** Chinese label shown on hover. */\n label: string;\n}\n\nexport const COMMON_COLORS: NamedColor[] = [\n { value: '#000000', label: '黑' },\n { value: '#ffffff', label: '白' },\n { value: '#ef4444', label: '赤' },\n { value: '#f97316', label: '橙' },\n { value: '#eab308', label: '黄' },\n { value: '#22c55e', label: '绿' },\n { value: '#06b6d4', label: '青' },\n { value: '#3b82f6', label: '蓝' },\n { value: '#8b5cf6', label: '紫' },\n { value: '#ec4899', label: '粉' },\n];\n\n/** True when `value` is a `theme:*` token. */\nexport function isThemeToken(value: string | undefined | null): value is string {\n return typeof value === 'string' && value.startsWith(THEME_COLOR_PREFIX);\n}\n\n// Module-level cache of the currently resolved token -> `#rrggbb` mapping. The\n// render loop resolves tokens against this cache (cheap, synchronous) instead\n// of probing the DOM every frame. `refreshThemePalette` rebuilds it whenever\n// the theme changes.\nconst _palette = new Map<string, string>();\n\n/**\n * Re-resolve every theme token against the given host's themed scope and cache\n * the results. Call on init and whenever the active theme changes.\n */\nexport function refreshThemePalette(host: HTMLElement | null): void {\n for (const { token, cssVar } of THEME_COLOR_TOKENS) {\n _palette.set(token, cssColorToHexString(host, cssVar, '#000000'));\n }\n}\n\n/**\n * Resolve a stored color value to a concrete `#rrggbb`/literal color. Theme\n * tokens are looked up in the cached palette; anything else is returned as-is.\n */\nexport function resolveThemeColor(value: string | undefined | null, fallback = '#000000'): string {\n if (!value) return fallback;\n if (isThemeToken(value)) return _palette.get(value) ?? fallback;\n return value;\n}\n\n/**\n * Resolve a stored color to a value usable directly in the DOM. Theme tokens\n * map to their CSS variable so the browser tracks theme changes natively.\n */\nexport function resolveThemeColorCss(value: string | undefined | null, fallback = '#000000'): string {\n if (!value) return fallback;\n if (isThemeToken(value)) return TOKEN_TO_CSSVAR.get(value) ?? fallback;\n return value;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"themeColor.js","names":[],"sources":["../../../../../src/components/pro/Flow/utils/themeColor.ts"],"sourcesContent":["/**\n * Resolve a CSS color value (including theme custom properties like\n * `var(--color-base-100)` that may use `oklch(...)`) into a concrete sRGB color\n * for the WebGL canvas.\n *\n * PixiJS needs a numeric/hex color and cannot read CSS variables. Resolution:\n * 1. A hidden probe element inherits the themed scope. Its `color` is set to\n * `color-mix(in srgb, <value> 100%, transparent)`, which forces the\n * browser to convert the color into the sRGB space at computed-value\n * time. `getComputedStyle` then serializes it as a plain `rgb(...)` or\n * `color(srgb ...)` string.\n * 2. That string is parsed directly (no canvas). Canvas rasterization is\n * only a last resort: some engines silently reject CSS Color 4 functions\n * (`oklch()`, `lab()`, `color()`) in `fillStyle`, which previously turned\n * every probed theme color black.\n */\n\nlet _rasterCtx: CanvasRenderingContext2D | null = null;\nfunction getRasterCtx(): CanvasRenderingContext2D | null {\n if (_rasterCtx) return _rasterCtx;\n if (typeof document === 'undefined') return null;\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n _rasterCtx = canvas.getContext('2d', { willReadFrequently: true });\n return _rasterCtx;\n}\n\n/** Rasterize any CSS color string to concrete sRGB bytes. */\nfunction rasterizeColor(cssColor: string): [number, number, number] | null {\n const ctx = getRasterCtx();\n if (!ctx) return null;\n try {\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = '#000000';\n ctx.fillStyle = cssColor; // ignored if the browser can't parse it\n ctx.fillRect(0, 0, 1, 1);\n const { data } = ctx.getImageData(0, 0, 1, 1);\n return [data[0], data[1], data[2]];\n } catch {\n return null;\n }\n}\n\nfunction byte(v: number): number {\n return Math.max(0, Math.min(255, Math.round(v)));\n}\n\n/**\n * Parse the sRGB strings a browser serializes a computed color to when the\n * color was forced into the sRGB space: `rgb(...)` / `rgba(...)` (0-255\n * channels) or `color(srgb r g b / a)` (0-1 float channels).\n */\nfunction parseSrgbString(value: string): [number, number, number] | null {\n const rgb = /^rgba?\\(\\s*([\\d.eE+-]+)[\\s,]+([\\d.eE+-]+)[\\s,]+([\\d.eE+-]+)/.exec(value);\n if (rgb) return [byte(+rgb[1]), byte(+rgb[2]), byte(+rgb[3])];\n const fn = /^color\\(\\s*srgb\\s+([\\d.eE+-]+)\\s+([\\d.eE+-]+)\\s+([\\d.eE+-]+)/i.exec(value);\n if (fn) return [byte(+fn[1] * 255), byte(+fn[2] * 255), byte(+fn[3] * 255)];\n return null;\n}\n\n/** Whether the browser computes color-mix() (used to force sRGB output). */\nconst SUPPORTS_COLOR_MIX =\n typeof CSS !== 'undefined' &&\n typeof CSS.supports === 'function' &&\n CSS.supports('color', 'color-mix(in srgb, red, blue)');\n\nfunction parseRgb(host: HTMLElement | null, cssValue: string): [number, number, number] | null {\n if (typeof document === 'undefined') return null;\n try {\n const probe = document.createElement('span');\n // Keep out of layout without `display:none` so `color` still resolves.\n probe.style.position = 'absolute';\n probe.style.width = '0';\n probe.style.height = '0';\n probe.style.overflow = 'hidden';\n probe.style.pointerEvents = 'none';\n (host ?? document.body).appendChild(probe);\n // Bail out when the requested custom property is undefined in this scope:\n // var() would invalidate the declaration and the probe would report its\n // inherited text color instead of the theme color.\n const varMatch = /^var\\(\\s*(--[\\w-]+)\\s*\\)$/.exec(cssValue);\n if (varMatch && !getComputedStyle(probe).getPropertyValue(varMatch[1]).trim()) {\n probe.remove();\n return null;\n }\n // Force the resolved color into the sRGB space at computed-value time, so\n // the serialized result is a plain rgb()/color(srgb) string we can parse\n // ourselves. Do NOT rasterize oklch()/lab() via canvas fillStyle here:\n // some engines (e.g. WebKit) silently reject CSS Color 4 functions in\n // canvas, which used to turn every probed theme color black.\n probe.style.color = SUPPORTS_COLOR_MIX\n ? `color-mix(in srgb, ${cssValue} 100%, transparent)`\n : cssValue;\n const resolved = getComputedStyle(probe).color;\n probe.remove();\n return parseSrgbString(resolved) ?? rasterizeColor(resolved);\n } catch {\n return null;\n }\n}\n\n/** Resolve a CSS color to a 0xRRGGBB number (for PixiJS). */\nexport function cssColorToNumber(host: HTMLElement | null, cssValue: string, fallback: number): number {\n const rgb = parseRgb(host, cssValue);\n if (!rgb) return fallback;\n return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n}\n\n/** Resolve a CSS color to a `#rrggbb` string (for persisted node data). */\nexport function cssColorToHexString(host: HTMLElement | null, cssValue: string, fallback: string): string {\n const rgb = parseRgb(host, cssValue);\n if (!rgb) return fallback;\n return '#' + rgb.map((c) => c.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * The colors the Flow canvas derives from the active theme:\n * - `background`: the canvas backdrop, follows the theme's muted background.\n * - `gridDot`: grid dots, derived from the theme foreground color.\n * - `nodeFill`: default fill for new shapes, follows the theme base background.\n */\nexport interface FlowThemeColors {\n background: number;\n gridDot: number;\n nodeFill: string;\n nodeText: string;\n}\n\nexport function resolveFlowThemeColors(host: HTMLElement | null): FlowThemeColors {\n return {\n background: cssColorToNumber(host, 'var(--color-base-200)', 0xf8f9fa),\n gridDot: cssColorToNumber(host, 'var(--color-base-content)', 0xd1d5db),\n nodeFill: cssColorToHexString(host, 'var(--color-base-100)', '#ffffff'),\n nodeText: cssColorToHexString(host, 'var(--color-base-content)', '#111827'),\n };\n}\n\n/* ============================================================================\n * Theme color tokens\n *\n * Node/edge colors may be stored either as a literal color (`#rrggbb`,\n * `transparent`, …) or as a THEME TOKEN of the form `theme:<name>` (e.g.\n * `theme:base-100`). Theme tokens are resolved to the live theme color at\n * render time, so shapes that use them re-color automatically whenever the\n * DishUI theme changes. These tokens are the default colors for new shapes.\n * ========================================================================== */\n\nexport const THEME_COLOR_PREFIX = 'theme:';\n\n/** A selectable theme color, shown as a swatch in the inspector. */\nexport interface ThemeColorToken {\n /** Stored value, e.g. `theme:base-100`. */\n token: string;\n /** CSS custom property backing the token. */\n cssVar: string;\n /** Short label for the inspector tooltip. */\n label: string;\n}\n\n/** The theme colors offered as presets/defaults for Flow color fields. */\nexport const THEME_COLOR_TOKENS: ThemeColorToken[] = [\n { token: 'theme:base-100', cssVar: 'var(--color-base-100)', label: 'Base 100' },\n { token: 'theme:base-200', cssVar: 'var(--color-base-200)', label: 'Base 200' },\n { token: 'theme:base-300', cssVar: 'var(--color-base-300)', label: 'Base 300' },\n { token: 'theme:base-content', cssVar: 'var(--color-base-content)', label: 'Base Content' },\n { token: 'theme:primary', cssVar: 'var(--color-primary)', label: 'Primary' },\n { token: 'theme:secondary', cssVar: 'var(--color-secondary)', label: 'Secondary' },\n { token: 'theme:accent', cssVar: 'var(--color-accent)', label: 'Accent' },\n { token: 'theme:neutral', cssVar: 'var(--color-neutral)', label: 'Neutral' },\n { token: 'theme:info', cssVar: 'var(--color-info)', label: 'Info' },\n { token: 'theme:success', cssVar: 'var(--color-success)', label: 'Success' },\n { token: 'theme:warning', cssVar: 'var(--color-warning)', label: 'Warning' },\n { token: 'theme:error', cssVar: 'var(--color-error)', label: 'Error' },\n];\n\nconst TOKEN_TO_CSSVAR = new Map(THEME_COLOR_TOKENS.map((t) => [t.token, t.cssVar]));\nconst TOKEN_TO_LABEL = new Map(THEME_COLOR_TOKENS.map((t) => [t.token, t.label]));\n\n/**\n * The \"follow theme\" default token for each color field type. Each field syncs\n * to a theme role so shapes stay legible against the canvas:\n * - `fill` -> theme background (base-100)\n * - `stroke` -> theme hairline (base-300) — a calm, low-contrast outline\n * - `text` -> theme font color (base-content)\n * - `line` -> theme hairline (base-300) — lines/edges\n */\nexport type ThemeColorFieldKind = 'fill' | 'stroke' | 'text' | 'line';\n\nexport const THEME_SYNC_TOKEN: Record<ThemeColorFieldKind, string> = {\n fill: 'theme:base-100',\n stroke: 'theme:base-300',\n text: 'theme:base-content',\n line: 'theme:base-300',\n};\n\n/** The CSS var backing a given theme token (for live-updating DOM swatches). */\nexport function themeTokenCssVar(token: string): string | undefined {\n return TOKEN_TO_CSSVAR.get(token);\n}\n\n/** Human label for a theme token (for tooltips). */\nexport function themeTokenLabel(token: string): string | undefined {\n return TOKEN_TO_LABEL.get(token);\n}\n\n/**\n * Common named colors offered after the theme-sync swatch: a compact rainbow\n * plus black/white. Order follows 黑白赤橙黄绿青蓝紫粉 (black, white, red,\n * orange, yellow, green, cyan, blue, purple, pink).\n */\nexport interface NamedColor {\n value: string;\n /** Chinese label shown on hover. */\n label: string;\n}\n\nexport const COMMON_COLORS: NamedColor[] = [\n { value: '#000000', label: '黑' },\n { value: '#ffffff', label: '白' },\n { value: '#ef4444', label: '赤' },\n { value: '#f97316', label: '橙' },\n { value: '#eab308', label: '黄' },\n { value: '#22c55e', label: '绿' },\n { value: '#06b6d4', label: '青' },\n { value: '#3b82f6', label: '蓝' },\n { value: '#8b5cf6', label: '紫' },\n { value: '#ec4899', label: '粉' },\n];\n\n/** True when `value` is a `theme:*` token. */\nexport function isThemeToken(value: string | undefined | null): value is string {\n return typeof value === 'string' && value.startsWith(THEME_COLOR_PREFIX);\n}\n\n// Module-level cache of the currently resolved token -> `#rrggbb` mapping. The\n// render loop resolves tokens against this cache (cheap, synchronous) instead\n// of probing the DOM every frame. `refreshThemePalette` rebuilds it whenever\n// the theme changes.\nconst _palette = new Map<string, string>();\n\n/**\n * Re-resolve every theme token against the given host's themed scope and cache\n * the results. Call on init and whenever the active theme changes.\n */\nexport function refreshThemePalette(host: HTMLElement | null): void {\n for (const { token, cssVar } of THEME_COLOR_TOKENS) {\n _palette.set(token, cssColorToHexString(host, cssVar, '#000000'));\n }\n}\n\n/**\n * Resolve a stored color value to a concrete `#rrggbb`/literal color. Theme\n * tokens are looked up in the cached palette; anything else is returned as-is.\n */\nexport function resolveThemeColor(value: string | undefined | null, fallback = '#000000'): string {\n if (!value) return fallback;\n if (isThemeToken(value)) return _palette.get(value) ?? fallback;\n return value;\n}\n\n/**\n * Resolve a stored color to a value usable directly in the DOM. Theme tokens\n * map to their CSS variable so the browser tracks theme changes natively.\n */\nexport function resolveThemeColorCss(value: string | undefined | null, fallback = '#000000'): string {\n if (!value) return fallback;\n if (isThemeToken(value)) return TOKEN_TO_CSSVAR.get(value) ?? fallback;\n return value;\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import type { KanbanProps } from "./types";
3
+ export default function Kanban({ columns, lanes, cards, onCardMove, renderCard, renderColumnHeader, renderLaneHeader, readOnly, loading, error, stale, empty, onRetry, labels: labelsInput, dragThreshold, columnWidth, height, collapsedLaneIds, defaultCollapsedLaneIds, onCollapsedLaneIdsChange, className, style, ...rest }: KanbanProps): React.JSX.Element;
@@ -0,0 +1,339 @@
1
+ import e from "../../Card/index.js";
2
+ import { cardsAt as t, createCardMove as n, getCardLocation as r, idText as i, idsEqual as a, locationEquals as o } from "./utils.js";
3
+ /* empty css */
4
+ import s from "./Swimlanes.js";
5
+ import { useKanbanDrag as c } from "./useKanbanDrag.js";
6
+ import l, { useCallback as u, useEffect as d, useMemo as ee, useRef as te, useState as f } from "react";
7
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
8
+ //#region src/components/pro/Kanban/Kanban.tsx
9
+ var ne = {
10
+ loading: "Loading board",
11
+ empty: "No cards",
12
+ error: "Could not load the board.",
13
+ stale: "Outdated data",
14
+ retry: "Try again",
15
+ unnamedColumn: "Untitled column",
16
+ unnamedLane: "Untitled lane",
17
+ card: "card",
18
+ lift: "Lifted",
19
+ move: "Move with the arrow keys.",
20
+ drop: "Dropped",
21
+ cancel: "Move cancelled"
22
+ }, g = e.Ticket;
23
+ function _(e) {
24
+ return typeof e == "number" ? `${e}px` : e;
25
+ }
26
+ function v(e, t) {
27
+ if (e !== void 0) return t.find((t) => String(t.id) === String(e))?.id ?? e;
28
+ }
29
+ function y(e, t) {
30
+ return typeof e == "string" || typeof e == "number" ? String(e) : t;
31
+ }
32
+ function re(e) {
33
+ return /* @__PURE__ */ m(g, {
34
+ issueKey: e.issueKey ?? e.id,
35
+ title: e.title,
36
+ description: e.description,
37
+ status: e.status,
38
+ issueType: e.issueType,
39
+ assignees: e.assignees,
40
+ priority: e.priority,
41
+ labels: e.labels,
42
+ dueDate: e.dueDate,
43
+ estimate: e.estimate,
44
+ subtaskProgress: e.subtaskProgress,
45
+ disabled: e.disabled
46
+ });
47
+ }
48
+ function b({ columns: e, lanes: g, cards: b, onCardMove: S, renderCard: C, renderColumnHeader: w, renderLaneHeader: T, readOnly: E = !1, loading: D = !1, error: O, stale: ie = !1, empty: k, onRetry: A, labels: j, dragThreshold: M = 5, columnWidth: N = 280, height: P, collapsedLaneIds: F, defaultCollapsedLaneIds: I, onCollapsedLaneIdsChange: L, className: ae = "", style: R, ...oe }) {
49
+ let z = ee(() => ({
50
+ ...ne,
51
+ ...j
52
+ }), [j]), [B, V] = f(null), [H, U] = f(null), [se, W] = f(""), G = te(null), K = u((t, r) => {
53
+ let i = {
54
+ columnId: v(r.columnId, e),
55
+ laneId: g ? v(r.laneId, g) : void 0,
56
+ index: r.index
57
+ }, a = n(b, t, i);
58
+ a && !o(a.from, a.to) && S?.(a);
59
+ }, [
60
+ b,
61
+ e,
62
+ g,
63
+ S
64
+ ]), q = c({
65
+ threshold: M,
66
+ disabled: E || !S,
67
+ onDrop: K
68
+ }), J = q.draggingId ?? B, Y = q.target ?? H, X = u((e = !0) => {
69
+ B !== null && (V(null), U(null), e && W(z.cancel), requestAnimationFrame(() => G.current?.focus()));
70
+ }, [B, z.cancel]);
71
+ d(() => {
72
+ let e = () => X(!1);
73
+ return window.addEventListener("blur", e), () => window.removeEventListener("blur", e);
74
+ }, [X]);
75
+ let Z = u((t) => {
76
+ let n = e.find((e) => a(e.id, t.columnId)), r = g?.find((e) => a(e.id, t.laneId));
77
+ return `${y(n?.title, z.unnamedColumn)}${r ? `, ${y(r.title, z.unnamedLane)}` : ""}, position ${t.index + 1}`;
78
+ }, [
79
+ e,
80
+ g,
81
+ z.unnamedColumn,
82
+ z.unnamedLane
83
+ ]), Q = u((n) => {
84
+ if (B === null || !H) return;
85
+ let r = Math.max(0, e.findIndex((e) => a(e.id, H.columnId))), i = g ? Math.max(0, g.findIndex((e) => a(e.id, H.laneId))) : 0, o = r, s = i, c = H.index;
86
+ if (n === "ArrowLeft" && (o = Math.max(0, r - 1)), n === "ArrowRight" && (o = Math.min(e.length - 1, r + 1)), n === "ArrowUp" && (c > 0 ? --c : g && i > 0 && --s), n === "ArrowDown") {
87
+ let e = t(b.filter((e) => !a(e.id, B)), H.columnId, H.laneId).length;
88
+ c < e ? c += 1 : g && i < g.length - 1 && (s += 1);
89
+ }
90
+ let l = e[o]?.id ?? H.columnId, u = g?.[s]?.id;
91
+ if (o !== r || s !== i) {
92
+ let e = t(b.filter((e) => !a(e.id, B)), l, u).length;
93
+ c = Math.min(c, e);
94
+ }
95
+ let d = {
96
+ columnId: l,
97
+ laneId: u,
98
+ index: c
99
+ };
100
+ U(d), W(Z(d));
101
+ }, [
102
+ b,
103
+ e,
104
+ Z,
105
+ B,
106
+ H,
107
+ g
108
+ ]), ce = u((e, t) => {
109
+ if (!(e.target !== e.currentTarget || t.disabled || E || !S)) {
110
+ if (e.key === "Escape") {
111
+ e.preventDefault(), X();
112
+ return;
113
+ }
114
+ if (e.key === " " || e.key === "Enter") {
115
+ if (e.preventDefault(), e.repeat) return;
116
+ if (B === null) {
117
+ let n = r(b, t.id);
118
+ if (!n) return;
119
+ G.current = e.currentTarget, V(t.id), U(n), W(`${z.lift} ${y(t.title, z.card)}. ${z.move}`);
120
+ } else a(B, t.id) && H && (K(t.id, H), V(null), U(null), W(`${z.drop} ${y(t.title, z.card)}. ${Z(H)}.`), requestAnimationFrame(() => G.current?.focus()));
121
+ return;
122
+ }
123
+ B !== null && [
124
+ "ArrowLeft",
125
+ "ArrowRight",
126
+ "ArrowUp",
127
+ "ArrowDown"
128
+ ].includes(e.key) && (e.preventDefault(), Q(e.key));
129
+ }
130
+ }, [
131
+ X,
132
+ b,
133
+ K,
134
+ Z,
135
+ B,
136
+ H,
137
+ z,
138
+ Q,
139
+ S,
140
+ E
141
+ ]), $ = (e, n) => {
142
+ let r = t(b, e.id, n?.id), s = E || !!e.disabled || !!n?.disabled || !S, c = 0;
143
+ return /* @__PURE__ */ h("div", {
144
+ className: "dishui-kanban__column",
145
+ role: "group",
146
+ "aria-label": y(e.title, z.unnamedColumn),
147
+ "data-column-id": i(e.id),
148
+ "data-lane-id": i(n?.id),
149
+ "data-disabled": s || void 0,
150
+ children: [!g && /* @__PURE__ */ m("div", {
151
+ className: "dishui-kanban__column-header",
152
+ children: w ? w(e, r) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("span", { children: e.title }), /* @__PURE__ */ m("span", {
153
+ className: "dishui-kanban__count",
154
+ children: r.length
155
+ })] })
156
+ }), /* @__PURE__ */ h("div", {
157
+ className: "dishui-kanban__cards",
158
+ children: [
159
+ r.length === 0 && J === null && /* @__PURE__ */ m("span", {
160
+ className: "dishui-kanban__cell-empty",
161
+ children: z.empty
162
+ }),
163
+ /* @__PURE__ */ m(x, {
164
+ columnId: e.id,
165
+ laneId: n?.id,
166
+ index: 0,
167
+ active: o(Y, {
168
+ columnId: e.id,
169
+ laneId: n?.id,
170
+ index: 0
171
+ })
172
+ }),
173
+ r.map((t) => {
174
+ let r = J !== null && a(J, t.id), i = c;
175
+ r || (c += 1);
176
+ let u = s || !!t.disabled;
177
+ return /* @__PURE__ */ h(l.Fragment, { children: [/* @__PURE__ */ m("div", {
178
+ className: "dishui-kanban__card",
179
+ role: "button",
180
+ tabIndex: u ? -1 : 0,
181
+ "aria-disabled": u,
182
+ "aria-describedby": "dishui-kanban-instructions",
183
+ "data-kanban-disabled": u || void 0,
184
+ "data-dragging": r || void 0,
185
+ onPointerDown: (e) => q.onPointerDown(e, t.id),
186
+ onPointerMove: q.onPointerMove,
187
+ onPointerUp: q.onPointerUp,
188
+ onPointerCancel: q.onPointerCancel,
189
+ onLostPointerCapture: q.onLostPointerCapture,
190
+ onKeyDown: (e) => ce(e, t),
191
+ children: C ? C(t, {
192
+ dragging: r,
193
+ keyboardDragging: a(B ?? void 0, t.id),
194
+ disabled: u
195
+ }) : re(t)
196
+ }), !r && /* @__PURE__ */ m(x, {
197
+ columnId: e.id,
198
+ laneId: n?.id,
199
+ index: i + 1,
200
+ active: o(Y, {
201
+ columnId: e.id,
202
+ laneId: n?.id,
203
+ index: i + 1
204
+ })
205
+ })] }, String(t.id));
206
+ })
207
+ ]
208
+ })]
209
+ }, `${i(n?.id)}:${i(e.id)}`);
210
+ }, le = {
211
+ ...R,
212
+ height: _(P) ?? R?.height,
213
+ "--dishui-kanban-column-width": _(N)
214
+ };
215
+ return /* @__PURE__ */ h("div", {
216
+ ...oe,
217
+ className: `dishui-kanban ${ae}`.trim(),
218
+ style: le,
219
+ "aria-busy": D || void 0,
220
+ children: [
221
+ /* @__PURE__ */ m("span", {
222
+ id: "dishui-kanban-instructions",
223
+ className: "dishui-kanban__sr-only",
224
+ children: "Press Space or Enter to lift and drop. Use arrow keys to choose a destination. Press Escape to cancel."
225
+ }),
226
+ /* @__PURE__ */ m("div", {
227
+ className: "dishui-kanban__sr-only",
228
+ role: "status",
229
+ "aria-live": "polite",
230
+ "aria-atomic": "true",
231
+ children: se
232
+ }),
233
+ ie && /* @__PURE__ */ m("div", {
234
+ className: "dishui-kanban__stale",
235
+ role: "status",
236
+ children: z.stale
237
+ }),
238
+ D ? /* @__PURE__ */ h("div", {
239
+ className: "dishui-kanban__state",
240
+ role: "status",
241
+ children: [/* @__PURE__ */ m("span", { children: z.loading }), /* @__PURE__ */ h("div", {
242
+ className: "dishui-kanban__skeletons",
243
+ "aria-hidden": "true",
244
+ children: [
245
+ /* @__PURE__ */ m("i", {}),
246
+ /* @__PURE__ */ m("i", {}),
247
+ /* @__PURE__ */ m("i", {})
248
+ ]
249
+ })]
250
+ }) : O ? /* @__PURE__ */ h("div", {
251
+ className: "dishui-kanban__state dishui-kanban__state--error",
252
+ role: "alert",
253
+ children: [
254
+ /* @__PURE__ */ m("strong", { children: z.error }),
255
+ /* @__PURE__ */ m("span", { children: O }),
256
+ A && /* @__PURE__ */ m("button", {
257
+ type: "button",
258
+ onClick: A,
259
+ children: z.retry
260
+ })
261
+ ]
262
+ }) : e.length === 0 || b.length === 0 ? /* @__PURE__ */ m("div", {
263
+ className: "dishui-kanban__state dishui-kanban__state--empty",
264
+ children: k ?? z.empty
265
+ }) : /* @__PURE__ */ h("div", {
266
+ className: "dishui-kanban__scroll",
267
+ "data-dragging": J !== null || void 0,
268
+ children: [g && g.length > 0 && /* @__PURE__ */ m("div", {
269
+ className: "dishui-kanban__column-headers",
270
+ style: { gridTemplateColumns: `repeat(${e.length}, minmax(var(--dishui-kanban-column-width), 1fr))` },
271
+ children: e.map((e) => {
272
+ let t = b.filter((t) => a(t.columnId, e.id));
273
+ return /* @__PURE__ */ m("div", {
274
+ className: "dishui-kanban__column-header",
275
+ children: w ? w(e, t) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("span", { children: e.title }), /* @__PURE__ */ m("span", {
276
+ className: "dishui-kanban__count",
277
+ children: t.length
278
+ })] })
279
+ }, String(e.id));
280
+ })
281
+ }), g && g.length > 0 ? /* @__PURE__ */ m(s, {
282
+ lanes: g,
283
+ collapsedLaneIds: F,
284
+ defaultCollapsedLaneIds: I,
285
+ onCollapsedLaneIdsChange: L,
286
+ renderLaneHeader: (e, t) => {
287
+ let n = b.filter((t) => a(t.laneId, e.id));
288
+ return /* @__PURE__ */ h("button", {
289
+ className: "dishui-swimlane__toggle",
290
+ type: "button",
291
+ "aria-expanded": !t.collapsed,
292
+ onClick: t.toggle,
293
+ children: [
294
+ /* @__PURE__ */ m("span", {
295
+ className: "dishui-swimlane__chevron",
296
+ "aria-hidden": "true",
297
+ children: "▾"
298
+ }),
299
+ /* @__PURE__ */ m("span", {
300
+ className: "dishui-swimlane__header-content",
301
+ children: T ? T(e, n) : e.title
302
+ }),
303
+ /* @__PURE__ */ m("span", {
304
+ className: "dishui-kanban__count",
305
+ children: n.length
306
+ })
307
+ ]
308
+ });
309
+ },
310
+ children: ({ lane: t }) => /* @__PURE__ */ m("div", {
311
+ className: "dishui-kanban__grid",
312
+ style: { gridTemplateColumns: `repeat(${e.length}, minmax(var(--dishui-kanban-column-width), 1fr))` },
313
+ children: e.map((e) => $(e, t))
314
+ })
315
+ }) : /* @__PURE__ */ m("div", {
316
+ className: "dishui-kanban__grid",
317
+ style: { gridTemplateColumns: `repeat(${e.length}, minmax(var(--dishui-kanban-column-width), 1fr))` },
318
+ children: e.map((e) => $(e))
319
+ })]
320
+ })
321
+ ]
322
+ });
323
+ }
324
+ function x({ columnId: e, laneId: t, index: n, active: r }) {
325
+ return /* @__PURE__ */ m("div", {
326
+ className: "dishui-kanban__drop-zone",
327
+ "data-kanban-drop": "true",
328
+ "data-column-id": String(e),
329
+ "data-lane-id": t === void 0 ? "" : String(t),
330
+ "data-index": n,
331
+ "data-active": r || void 0,
332
+ "aria-hidden": "true",
333
+ children: /* @__PURE__ */ m("span", {})
334
+ });
335
+ }
336
+ //#endregion
337
+ export { b as default };
338
+
339
+ //# sourceMappingURL=Kanban.js.map