cursedbelt 5.85.0 → 5.85.1

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.
@@ -13,6 +13,12 @@
13
13
  * simply there. The animation still runs for 0s, so Radix's `Presence` sees its `animationend`
14
14
  * and unmounts on close exactly as it does with motion on.
15
15
  *
16
+ * 🔴 A closing overlay lets the pointer through (`CLOSED_PASSTHROUGH`, in every constant below). Its
17
+ * exit runs for the whole duration at near-zero opacity, still mounted, and until then it took every
18
+ * click and drag over it: measured in desk (forge task 3488), a drag begun 0.2s after picking a menu
19
+ * item landed on the fading menu's next item instead of the canvas beneath. `e2e/motion.spec.ts`
20
+ * reads `pointer-events` at the instant `data-state` turns `closed`.
21
+ *
16
22
  * Each overlay's own direction stays its own: an anchored panel comes from its anchor's side, a
17
23
  * drawer slides its whole width in from its edge. What they share is the curve and the speed.
18
24
  *
@@ -32,6 +38,6 @@ export declare const DIALOG_MOTION: string;
32
38
  export declare const SCRIM_MOTION: string;
33
39
  /** A drawer's SPEED and curve. Its slide (`slide-in-from-left` …) is its edge's, so it stays at
34
40
  * the call site; this is what makes it ease like every other overlay instead of tw-animate's
35
- * 150ms `ease`. */
36
- export declare const DRAWER_MOTION = "duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0";
41
+ * 150ms `ease`, and lets the pointer through while it closes. */
42
+ export declare const DRAWER_MOTION: string;
37
43
  //# sourceMappingURL=overlayMotion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlayMotion.d.ts","sourceRoot":"","sources":["../../../src/react/lib/overlayMotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;4FAE4F;AAC5F,eAAO,MAAM,cAAc,QAKsD,CAAC;AAElF,iGAAiG;AACjG,eAAO,MAAM,eAAe,QAMqD,CAAC;AAElF;kFACkF;AAClF,eAAO,MAAM,aAAa,QAG6E,CAAC;AAExG,2FAA2F;AAC3F,eAAO,MAAM,YAAY,QAGyC,CAAC;AAEnE;;oBAEoB;AACpB,eAAO,MAAM,aAAa,oFAAoF,CAAC"}
1
+ {"version":3,"file":"overlayMotion.d.ts","sourceRoot":"","sources":["../../../src/react/lib/overlayMotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH;;4FAE4F;AAC5F,eAAO,MAAM,cAAc,QAMsD,CAAC;AAElF,iGAAiG;AACjG,eAAO,MAAM,eAAe,QAOqD,CAAC;AAElF;kFACkF;AAClF,eAAO,MAAM,aAAa,QAIN,CAAC;AAErB,2FAA2F;AAC3F,eAAO,MAAM,YAAY,QAIL,CAAC;AAErB;;kEAEkE;AAClE,eAAO,MAAM,aAAa,QAA0G,CAAC"}
@@ -13,18 +13,29 @@
13
13
  * simply there. The animation still runs for 0s, so Radix's `Presence` sees its `animationend`
14
14
  * and unmounts on close exactly as it does with motion on.
15
15
  *
16
+ * 🔴 A closing overlay lets the pointer through (`CLOSED_PASSTHROUGH`, in every constant below). Its
17
+ * exit runs for the whole duration at near-zero opacity, still mounted, and until then it took every
18
+ * click and drag over it: measured in desk (forge task 3488), a drag begun 0.2s after picking a menu
19
+ * item landed on the fading menu's next item instead of the canvas beneath. `e2e/motion.spec.ts`
20
+ * reads `pointer-events` at the instant `data-state` turns `closed`.
21
+ *
16
22
  * Each overlay's own direction stays its own: an anchored panel comes from its anchor's side, a
17
23
  * drawer slides its whole width in from its edge. What they share is the curve and the speed.
18
24
  *
19
25
  * 🔴 Literals only — Tailwind's JIT reads source text (see `tapTarget.ts`). `e2e/motion.spec.ts`
20
26
  * opens each primitive and reads its running animation from `getAnimations()`.
21
27
  */
28
+ /** What every overlay does once it is closing: nothing under the pointer. Important, because
29
+ * Radix writes `pointer-events: auto` INLINE on a dialog's overlay (the body is `none` under a
30
+ * modal) and an inline style beats any class — the scrim kept the pointer with the plain one. */
31
+ const CLOSED_PASSTHROUGH = 'data-[state=closed]:pointer-events-none!';
22
32
  /** A tooltip: the fast speed, a fade and a 4px rise from its trigger's side. Only a DELAYED
23
33
  * open animates — moving between triggers inside the skip-delay window (`instant-open`) swaps
24
34
  * the bubble in place, the way Linear's do, instead of re-fading it on every neighbour. */
25
35
  export const TOOLTIP_MOTION = 'duration-[var(--duration-fast)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
26
36
  'data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-[0.985] ' +
27
37
  'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 ' +
38
+ CLOSED_PASSTHROUGH + ' ' +
28
39
  'data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 ' +
29
40
  'data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1';
30
41
  /** An anchored panel (popover, menu, select, hover card): base speed, rising from its anchor. */
@@ -32,19 +43,22 @@ export const ANCHORED_MOTION = 'duration-[var(--duration-base)] ease-[var(--ease
32
43
  'data-[state=open]:animate-in data-[state=closed]:animate-out ' +
33
44
  'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 ' +
34
45
  'data-[state=closed]:zoom-out-[0.985] data-[state=open]:zoom-in-[0.985] ' +
46
+ CLOSED_PASSTHROUGH + ' ' +
35
47
  'data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2 ' +
36
48
  'data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2';
37
49
  /** A dialog's panel (Modal, ConfirmDialog, PromptDialog, Lightbox, the palette, a full-screen
38
50
  * dialog): slow speed, rising 8px from below and from 0.985 — `animate-rise`. */
39
51
  export const DIALOG_MOTION = 'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
40
52
  'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-[0.985] data-[state=open]:slide-in-from-bottom-2 ' +
41
- 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-[0.985]';
53
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-[0.985] ' +
54
+ CLOSED_PASSTHROUGH;
42
55
  /** The scrim behind a dialog or drawer: a fade at the speed of the panel it sits under. */
43
56
  export const SCRIM_MOTION = 'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
44
57
  'data-[state=open]:animate-in data-[state=open]:fade-in-0 ' +
45
- 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0';
58
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 ' +
59
+ CLOSED_PASSTHROUGH;
46
60
  /** A drawer's SPEED and curve. Its slide (`slide-in-from-left` …) is its edge's, so it stays at
47
61
  * the call site; this is what makes it ease like every other overlay instead of tw-animate's
48
- * 150ms `ease`. */
49
- export const DRAWER_MOTION = 'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0';
62
+ * 150ms `ease`, and lets the pointer through while it closes. */
63
+ export const DRAWER_MOTION = 'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0 ' + CLOSED_PASSTHROUGH;
50
64
  //# sourceMappingURL=overlayMotion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlayMotion.js","sourceRoot":"","sources":["../../../src/react/lib/overlayMotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;;4FAE4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GACzB,kFAAkF;IAClF,qHAAqH;IACrH,iEAAiE;IACjE,gFAAgF;IAChF,+EAA+E,CAAC;AAElF,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAC1B,kFAAkF;IAClF,+DAA+D;IAC/D,6DAA6D;IAC7D,yEAAyE;IACzE,gFAAgF;IAChF,+EAA+E,CAAC;AAElF;kFACkF;AAClF,MAAM,CAAC,MAAM,aAAa,GACxB,kFAAkF;IAClF,sIAAsI;IACtI,qGAAqG,CAAC;AAExG,2FAA2F;AAC3F,MAAM,CAAC,MAAM,YAAY,GACvB,kFAAkF;IAClF,2DAA2D;IAC3D,gEAAgE,CAAC;AAEnE;;oBAEoB;AACpB,MAAM,CAAC,MAAM,aAAa,GAAG,iFAAiF,CAAC"}
1
+ {"version":3,"file":"overlayMotion.js","sourceRoot":"","sources":["../../../src/react/lib/overlayMotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH;;kGAEkG;AAClG,MAAM,kBAAkB,GAAG,0CAA0C,CAAC;AAEtE;;4FAE4F;AAC5F,MAAM,CAAC,MAAM,cAAc,GACzB,kFAAkF;IAClF,qHAAqH;IACrH,iEAAiE;IACjE,kBAAkB,GAAG,GAAG;IACxB,gFAAgF;IAChF,+EAA+E,CAAC;AAElF,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAC1B,kFAAkF;IAClF,+DAA+D;IAC/D,6DAA6D;IAC7D,yEAAyE;IACzE,kBAAkB,GAAG,GAAG;IACxB,gFAAgF;IAChF,+EAA+E,CAAC;AAElF;kFACkF;AAClF,MAAM,CAAC,MAAM,aAAa,GACxB,kFAAkF;IAClF,sIAAsI;IACtI,sGAAsG;IACtG,kBAAkB,CAAC;AAErB,2FAA2F;AAC3F,MAAM,CAAC,MAAM,YAAY,GACvB,kFAAkF;IAClF,2DAA2D;IAC3D,iEAAiE;IACjE,kBAAkB,CAAC;AAErB;;kEAEkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,kFAAkF,GAAG,kBAAkB,CAAC"}
@@ -15,7 +15,7 @@
15
15
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
16
16
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
17
17
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
18
- * 927 candidate(s).
18
+ * 928 candidate(s).
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -88,13 +88,13 @@
88
88
  @source inline("data-[state=checked]:ring-accent data-[state=checked]:text-white");
89
89
  @source inline("data-[state=checked]:translate-x-4 data-[state=closed]:animate-collapsible-up");
90
90
  @source inline("data-[state=closed]:animate-out data-[state=closed]:fade-out-0");
91
- @source inline("data-[state=closed]:slide-out-to-bottom data-[state=closed]:slide-out-to-left");
92
- @source inline("data-[state=closed]:slide-out-to-right data-[state=closed]:zoom-out-[0.985]");
93
- @source inline("data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0");
94
- @source inline("data-[state=delayed-open]:zoom-in-[0.985] data-[state=indeterminate]:bg-accent-solid");
95
- @source inline("data-[state=indeterminate]:border-accent-solid data-[state=indeterminate]:text-white");
96
- @source inline("data-[state=open]:animate-collapsible-down data-[state=open]:animate-in");
97
- @source inline("data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom");
91
+ @source inline("data-[state=closed]:pointer-events-none! data-[state=closed]:slide-out-to-bottom");
92
+ @source inline("data-[state=closed]:slide-out-to-left data-[state=closed]:slide-out-to-right");
93
+ @source inline("data-[state=closed]:zoom-out-[0.985] data-[state=delayed-open]:animate-in");
94
+ @source inline("data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-[0.985]");
95
+ @source inline("data-[state=indeterminate]:bg-accent-solid data-[state=indeterminate]:border-accent-solid");
96
+ @source inline("data-[state=indeterminate]:text-white data-[state=open]:animate-collapsible-down");
97
+ @source inline("data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom");
98
98
  @source inline("data-[state=open]:slide-in-from-bottom-2 data-[state=open]:slide-in-from-left");
99
99
  @source inline("data-[state=open]:slide-in-from-right data-[state=open]:zoom-in-[0.985]");
100
100
  @source inline("data-[state=unchecked]:bg-muted data-[state=unchecked]:translate-x-0 disable disabled");
@@ -4444,6 +4444,9 @@
4444
4444
  --tw-ring-offset-width: 1px;
4445
4445
  --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
4446
4446
  }
4447
+ .data-\[state\=closed\]\:pointer-events-none\![data-state="closed"] {
4448
+ pointer-events: none !important;
4449
+ }
4447
4450
  .data-\[state\=closed\]\:animate-collapsible-up[data-state="closed"] {
4448
4451
  animation: collapsible-up var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);
4449
4452
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cursedbelt",
3
- "version": "5.85.0",
3
+ "version": "5.85.1",
4
4
  "license": "ISC",
5
5
  "type": "module",
6
6
  "description": "The React design system of the cursedbelt split — components, styles, theme. cursedbelt-core below it; server tier in cursedbelt-server.",
@@ -13,6 +13,12 @@
13
13
  * simply there. The animation still runs for 0s, so Radix's `Presence` sees its `animationend`
14
14
  * and unmounts on close exactly as it does with motion on.
15
15
  *
16
+ * 🔴 A closing overlay lets the pointer through (`CLOSED_PASSTHROUGH`, in every constant below). Its
17
+ * exit runs for the whole duration at near-zero opacity, still mounted, and until then it took every
18
+ * click and drag over it: measured in desk (forge task 3488), a drag begun 0.2s after picking a menu
19
+ * item landed on the fading menu's next item instead of the canvas beneath. `e2e/motion.spec.ts`
20
+ * reads `pointer-events` at the instant `data-state` turns `closed`.
21
+ *
16
22
  * Each overlay's own direction stays its own: an anchored panel comes from its anchor's side, a
17
23
  * drawer slides its whole width in from its edge. What they share is the curve and the speed.
18
24
  *
@@ -20,6 +26,11 @@
20
26
  * opens each primitive and reads its running animation from `getAnimations()`.
21
27
  */
22
28
 
29
+ /** What every overlay does once it is closing: nothing under the pointer. Important, because
30
+ * Radix writes `pointer-events: auto` INLINE on a dialog's overlay (the body is `none` under a
31
+ * modal) and an inline style beats any class — the scrim kept the pointer with the plain one. */
32
+ const CLOSED_PASSTHROUGH = 'data-[state=closed]:pointer-events-none!';
33
+
23
34
  /** A tooltip: the fast speed, a fade and a 4px rise from its trigger's side. Only a DELAYED
24
35
  * open animates — moving between triggers inside the skip-delay window (`instant-open`) swaps
25
36
  * the bubble in place, the way Linear's do, instead of re-fading it on every neighbour. */
@@ -27,6 +38,7 @@ export const TOOLTIP_MOTION =
27
38
  'duration-[var(--duration-fast)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
28
39
  'data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-[0.985] ' +
29
40
  'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 ' +
41
+ CLOSED_PASSTHROUGH + ' ' +
30
42
  'data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 ' +
31
43
  'data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1';
32
44
 
@@ -36,6 +48,7 @@ export const ANCHORED_MOTION =
36
48
  'data-[state=open]:animate-in data-[state=closed]:animate-out ' +
37
49
  'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 ' +
38
50
  'data-[state=closed]:zoom-out-[0.985] data-[state=open]:zoom-in-[0.985] ' +
51
+ CLOSED_PASSTHROUGH + ' ' +
39
52
  'data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2 ' +
40
53
  'data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2';
41
54
 
@@ -44,15 +57,17 @@ export const ANCHORED_MOTION =
44
57
  export const DIALOG_MOTION =
45
58
  'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
46
59
  'data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-[0.985] data-[state=open]:slide-in-from-bottom-2 ' +
47
- 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-[0.985]';
60
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-[0.985] ' +
61
+ CLOSED_PASSTHROUGH;
48
62
 
49
63
  /** The scrim behind a dialog or drawer: a fade at the speed of the panel it sits under. */
50
64
  export const SCRIM_MOTION =
51
65
  'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0 ' +
52
66
  'data-[state=open]:animate-in data-[state=open]:fade-in-0 ' +
53
- 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0';
67
+ 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 ' +
68
+ CLOSED_PASSTHROUGH;
54
69
 
55
70
  /** A drawer's SPEED and curve. Its slide (`slide-in-from-left` …) is its edge's, so it stays at
56
71
  * the call site; this is what makes it ease like every other overlay instead of tw-animate's
57
- * 150ms `ease`. */
58
- export const DRAWER_MOTION = 'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0';
72
+ * 150ms `ease`, and lets the pointer through while it closes. */
73
+ export const DRAWER_MOTION = 'duration-[var(--duration-slow)] ease-[var(--ease-out)] motion-reduce:duration-0 ' + CLOSED_PASSTHROUGH;
@@ -15,7 +15,7 @@
15
15
  * after an app's responsive variant (task 2124). An app that imports every area gets exactly
16
16
  * what `cursedbelt/styles-utilities.css` emits — proved rule by rule in
17
17
  * src/stylesAreas.spec.ts, which is also what fails when this file is stale.
18
- * 927 candidate(s).
18
+ * 928 candidate(s).
19
19
  *
20
20
  * Written by scripts/generateAreaStyles.ts (`bun run styles:areas`), which
21
21
  * `bun run build` runs. The map of what is in which area, and why the areas are
@@ -88,13 +88,13 @@
88
88
  @source inline("data-[state=checked]:ring-accent data-[state=checked]:text-white");
89
89
  @source inline("data-[state=checked]:translate-x-4 data-[state=closed]:animate-collapsible-up");
90
90
  @source inline("data-[state=closed]:animate-out data-[state=closed]:fade-out-0");
91
- @source inline("data-[state=closed]:slide-out-to-bottom data-[state=closed]:slide-out-to-left");
92
- @source inline("data-[state=closed]:slide-out-to-right data-[state=closed]:zoom-out-[0.985]");
93
- @source inline("data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0");
94
- @source inline("data-[state=delayed-open]:zoom-in-[0.985] data-[state=indeterminate]:bg-accent-solid");
95
- @source inline("data-[state=indeterminate]:border-accent-solid data-[state=indeterminate]:text-white");
96
- @source inline("data-[state=open]:animate-collapsible-down data-[state=open]:animate-in");
97
- @source inline("data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom");
91
+ @source inline("data-[state=closed]:pointer-events-none! data-[state=closed]:slide-out-to-bottom");
92
+ @source inline("data-[state=closed]:slide-out-to-left data-[state=closed]:slide-out-to-right");
93
+ @source inline("data-[state=closed]:zoom-out-[0.985] data-[state=delayed-open]:animate-in");
94
+ @source inline("data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-[0.985]");
95
+ @source inline("data-[state=indeterminate]:bg-accent-solid data-[state=indeterminate]:border-accent-solid");
96
+ @source inline("data-[state=indeterminate]:text-white data-[state=open]:animate-collapsible-down");
97
+ @source inline("data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom");
98
98
  @source inline("data-[state=open]:slide-in-from-bottom-2 data-[state=open]:slide-in-from-left");
99
99
  @source inline("data-[state=open]:slide-in-from-right data-[state=open]:zoom-in-[0.985]");
100
100
  @source inline("data-[state=unchecked]:bg-muted data-[state=unchecked]:translate-x-0 disable disabled");
@@ -4444,6 +4444,9 @@
4444
4444
  --tw-ring-offset-width: 1px;
4445
4445
  --tw-ring-offset-shadow: var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
4446
4446
  }
4447
+ .data-\[state\=closed\]\:pointer-events-none\![data-state="closed"] {
4448
+ pointer-events: none !important;
4449
+ }
4447
4450
  .data-\[state\=closed\]\:animate-collapsible-up[data-state="closed"] {
4448
4451
  animation: collapsible-up var(--tw-animation-duration,var(--tw-duration,.2s))var(--tw-ease,ease-out)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);
4449
4452
  }