@@ -23,6 +23,11 @@ for (const [name, id] of Object.entries(OPS)) {
2323 OPS_TO_NAME [ id ] = name ;
2424}
2525
26+ const BreakpointType = {
27+ PAUSE : 0 ,
28+ SKIP : 1 ,
29+ } ;
30+
2631// Single hidden color input reused for all swatch pickers.
2732const colorPickerInput = document . createElement ( "input" ) ;
2833colorPickerInput . type = "color" ;
@@ -408,7 +413,8 @@ class DrawOpsView {
408413
409414 #selectedLine = null ;
410415
411- #breakpoints = new Set ( ) ;
416+ // Map<opIndex, BreakpointType>
417+ #breakpoints = new Map ( ) ;
412418
413419 #originalColors = new Map ( ) ;
414420
@@ -553,27 +559,40 @@ class DrawOpsView {
553559 line . ariaSelected = "false" ;
554560 line . tabIndex = i === 0 ? 0 : - 1 ;
555561
556- // Breakpoint gutter — click to toggle a red-bullet breakpoint .
562+ // Breakpoint gutter — click cycles: none → pause (●) → skip (✕) → none .
557563 const gutter = document . createElement ( "span" ) ;
558564 gutter . className = "bp-gutter" ;
559565 gutter . role = "checkbox" ;
560566 gutter . tabIndex = 0 ;
561567 gutter . ariaLabel = "Breakpoint" ;
562- const isInitiallyActive = this . #breakpoints. has ( i ) ;
563- gutter . ariaChecked = String ( isInitiallyActive ) ;
564- if ( isInitiallyActive ) {
565- gutter . classList . add ( "active" ) ;
568+ const initBpType = this . #breakpoints. get ( i ) ;
569+ if ( initBpType === BreakpointType . PAUSE ) {
570+ gutter . dataset . bp = "pause" ;
571+ gutter . ariaChecked = "true" ;
572+ } else if ( initBpType === BreakpointType . SKIP ) {
573+ gutter . dataset . bp = "skip" ;
574+ gutter . ariaChecked = "mixed" ;
575+ line . classList . add ( "op-skipped" ) ;
576+ } else {
577+ gutter . ariaChecked = "false" ;
566578 }
567579 gutter . addEventListener ( "click" , e => {
568580 e . stopPropagation ( ) ;
569- if ( this . #breakpoints. has ( i ) ) {
581+ const current = this . #breakpoints. get ( i ) ;
582+ if ( current === undefined ) {
583+ this . #breakpoints. set ( i , BreakpointType . PAUSE ) ;
584+ gutter . dataset . bp = "pause" ;
585+ gutter . ariaChecked = "true" ;
586+ } else if ( current === BreakpointType . PAUSE ) {
587+ this . #breakpoints. set ( i , BreakpointType . SKIP ) ;
588+ gutter . dataset . bp = "skip" ;
589+ gutter . ariaChecked = "mixed" ;
590+ line . classList . add ( "op-skipped" ) ;
591+ } else {
570592 this . #breakpoints. delete ( i ) ;
571- gutter . classList . remove ( "active" ) ;
593+ delete gutter . dataset . bp ;
572594 gutter . ariaChecked = "false" ;
573- } else {
574- this . #breakpoints. add ( i ) ;
575- gutter . classList . add ( "active" ) ;
576- gutter . ariaChecked = "true" ;
595+ line . classList . remove ( "op-skipped" ) ;
577596 }
578597 } ) ;
579598 gutter . addEventListener ( "keydown" , e => {
@@ -656,4 +675,4 @@ class DrawOpsView {
656675 }
657676}
658677
659- export { DrawOpsView } ;
678+ export { BreakpointType , DrawOpsView } ;
0 commit comments