dsh-claude-style 0.2.7 → 0.3.0

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.
package/lib/client.js CHANGED
@@ -17,6 +17,7 @@
17
17
  * - src/overrides/permissions.js
18
18
  * - src/overrides/model-picker.js
19
19
  * - src/overrides/account-footer.js
20
+ * - src/overrides/ban-screen.js
20
21
  * - src/overrides/scheduler.js
21
22
  * - src/settings.js
22
23
  * - src/entry.js
@@ -31,6 +32,7 @@
31
32
  * - src/styles/sidebar.css
32
33
  * - src/styles/components/permissions.css
33
34
  * - src/styles/components/account-footer.css
35
+ * - src/styles/components/ban-screen.css
34
36
  * - src/styles/components/model-picker.css
35
37
  * - src/styles/components/footer-takeover.css
36
38
  * - src/styles/components/third-party.css
@@ -205,6 +207,17 @@ window.__ModuleLoader__.load({
205
207
 
206
208
  /** Present while the skin takes over the sidebar footer (settings area + account row). */
207
209
  var FOOTER_ATTR = 'data-dsh-claude-footer-takeover'
210
+ /**
211
+ * The language the account-hold easter egg (src/overrides/ban-screen.js) is
212
+ * written in. It is its own preference rather than "follow the shell",
213
+ * because the page reproduces a real Claude screen: the point is to read it
214
+ * in the language Claude actually used, whatever the shell is set to. The
215
+ * default is English for that reason.
216
+ */
217
+ var BAN_LOCALE_EN = 'en'
218
+ var BAN_LOCALE_ZH = 'zh'
219
+ var BAN_LOCALES = [BAN_LOCALE_EN, BAN_LOCALE_ZH]
220
+ var DEFAULT_BAN_LOCALE = BAN_LOCALE_EN
208
221
  /** Present while the composer restyle applies to the page currently shown. */
209
222
  var COMPOSER_ATTR = 'data-dsh-claude-composer-active'
210
223
  /**
@@ -417,9 +430,6 @@ window.__ModuleLoader__.load({
417
430
  " border-color: #e8e6dc;",
418
431
  "}",
419
432
  "",
420
- "body[data-dsh-claude-style]:not([data-ds-dark-theme]) table th {",
421
- " background: #f0eee6;",
422
- "}",
423
433
  "",
424
434
  "body[data-dsh-claude-style]:not([data-ds-dark-theme]) * {",
425
435
  " scrollbar-color: rgba(208, 205, 193, 0.9) transparent;",
@@ -532,19 +542,42 @@ window.__ModuleLoader__.load({
532
542
  " font-size: var(--dsh-content-font-size, 14px);",
533
543
  "}",
534
544
  "",
535
- "body[data-dsh-claude-style] [class*=\"markdown\"] th {",
536
- " background: #f0f0ef;",
545
+ "body[data-dsh-claude-style] [class*=\"tableScroll\"] thead th,",
546
+ "body[data-dsh-claude-style] [class*=\"tableScroll\"] thead td {",
547
+ " background: #f0f0ef !important;",
537
548
  "}",
538
549
  "",
539
- "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"markdown\"] th {",
540
- " background: #242320;",
550
+ "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"tableScroll\"] thead th,",
551
+ "body[data-dsh-claude-style][data-ds-dark-theme] [class*=\"tableScroll\"] thead td {",
552
+ " background: #242320 !important;",
541
553
  "}",
542
554
  "",
543
555
  "/* Table frame: same 0.5px line the host uses for row separators, rounded",
544
556
  " like the code block. The scroll container already clips its content. */",
545
- "body[data-dsh-claude-style] [class*=\"markdown\"] [class*=\"tableScroll\"] {",
557
+ "body[data-dsh-claude-style] [class*=\"tableScroll\"] {",
546
558
  " border: 0.5px solid var(--dsw-alias-border-l2);",
547
559
  " border-radius: 12px;",
560
+ " padding-left: 0 !important;",
561
+ " padding-right: 0 !important;",
562
+ " background-clip: padding-box;",
563
+ "}",
564
+ "",
565
+ "body[data-dsh-claude-style] [class*=\"tableScroll\"] table {",
566
+ " margin-left: 0 !important;",
567
+ " margin-right: 0 !important;",
568
+ " padding-left: 0 !important;",
569
+ " padding-right: 0 !important;",
570
+ " border-spacing: 0 !important;",
571
+ " border-collapse: collapse !important;",
572
+ "}",
573
+ "",
574
+ "/* Every first/last cell, whatever element the renderer used (th or td). */",
575
+ "body[data-dsh-claude-style] [class*=\"tableScroll\"] tr > :first-child {",
576
+ " padding-left: 16px !important;",
577
+ "}",
578
+ "",
579
+ "body[data-dsh-claude-style] [class*=\"tableScroll\"] tr > :last-child {",
580
+ " padding-right: 16px !important;",
548
581
  "}",
549
582
  "",
550
583
  "/* Heading rhythm. The host gives every heading a 32px top margin, which stacks",
@@ -578,7 +611,9 @@ window.__ModuleLoader__.load({
578
611
  "",
579
612
  "/* ---------- editorial markdown ---------- */",
580
613
  "/* Claude's quote keeps the prose face but stands upright on a neutral bar and",
581
- " wash; the warm accent stays reserved for controls. */",
614
+ " wash; the warm accent stays reserved for controls. Links, inline-code chips",
615
+ " and file mentions keep their own material inside a quote — the quote is a",
616
+ " container, not a link, so it never borrows the link colour. */",
582
617
  "body[data-dsh-claude-style] blockquote {",
583
618
  " font-family: var(--dsw-font-prose);",
584
619
  " font-style: normal;",
@@ -624,7 +659,12 @@ window.__ModuleLoader__.load({
624
659
  "}",
625
660
  "",
626
661
  "/* Claude's inline-code chip: warm red on the same neutral gray the components",
627
- " hover with — both resolve per theme from the palette blocks. */",
662
+ " hover with — both resolve per theme from the palette blocks. The chip hugs",
663
+ " its glyphs: the host makes it an inline-flex box that inherits the prose line",
664
+ " box (23px for a 15px code size), which left ~5px of empty wash above and",
665
+ " below the text. line-height 1.2 collapses that box onto the glyphs (27px →",
666
+ " 22px) and leaves the 1px padding as the visible inset; lower values start",
667
+ " clipping descenders. */",
628
668
  "body[data-dsh-claude-style] code:not(pre code) {",
629
669
  " font-family: var(--dsw-font-code);",
630
670
  " background: var(--dsh-claude-inline-code-bg);",
@@ -633,6 +673,7 @@ window.__ModuleLoader__.load({
633
673
  " border-radius: 4px;",
634
674
  " padding: 1px;",
635
675
  " font-size: calc(1em - 1px) !important;",
676
+ " line-height: 1.2;",
636
677
  "}",
637
678
  "",
638
679
  "/* Claude's links: blue, underlined at rest, and without the host's",
@@ -641,6 +682,33 @@ window.__ModuleLoader__.load({
641
682
  " display: none;",
642
683
  "}",
643
684
  "",
685
+ "/* Inline file mentions (and URL-promoted inline code) are links, not code: the",
686
+ " host resolves a file path inside an inline code span to a button and paints",
687
+ " it with its own link alias. This rule has to name them because the generic",
688
+ " inline-code chip above is more specific than the host's own class, so without",
689
+ " it a path like `CHANGELOG.md` kept the chip's warm red while real links were",
690
+ " blue. The class is hashed (`_fileMention_kcgor_304`), hence the longest",
691
+ " stable fragment. The chip itself is untouched — the same wash and hairline as",
692
+ " any other inline code — only the text takes the link colour and the link's",
693
+ " own underline: solid in the link tone at rest, solid and fully opaque on",
694
+ " hover, at the same thickness and offset, exactly how the skin treats an",
695
+ " anchor. The hover rule therefore touches the colour only: the",
696
+ " `text-decoration` shorthand would reset `text-decoration-thickness` to",
697
+ " `auto` and thin the underline mid-hover. */",
698
+ "body[data-dsh-claude-style] :is(code:not(pre code) > [class*=\"_fileMention\"], code:not(pre code) > a) {",
699
+ " color: var(--dsh-claude-link);",
700
+ " font-weight: 500;",
701
+ " text-decoration: underline;",
702
+ " text-decoration-color: var(--dsh-claude-link-underline);",
703
+ " text-decoration-thickness: 1.5px;",
704
+ " text-underline-offset: 2px;",
705
+ "}",
706
+ "",
707
+ "body[data-dsh-claude-style] :is(code:not(pre code) > [class*=\"_fileMention\"], code:not(pre code) > a):hover,",
708
+ "body[data-dsh-claude-style] :is(code:not(pre code) > [class*=\"_fileMention\"], code:not(pre code) > a):focus-visible {",
709
+ " text-decoration-color: var(--dsh-claude-link);",
710
+ "}",
711
+ "",
644
712
  "body[data-dsh-claude-style] [class*=\"markdown\"] :is(a, a:focus) {",
645
713
  " color: var(--dsh-claude-link);",
646
714
  " text-decoration: underline;",
@@ -659,23 +727,6 @@ window.__ModuleLoader__.load({
659
727
  " margin: 1.6em 0;",
660
728
  "}",
661
729
  "",
662
- "body[data-dsh-claude-style] table {",
663
- " border-collapse: collapse;",
664
- " font-size: 0.92em;",
665
- " width: 100%;",
666
- "}",
667
- "",
668
- "body[data-dsh-claude-style] table th {",
669
- " background: rgba(250, 249, 245, 0.06);",
670
- " font-weight: 600;",
671
- " text-align: left;",
672
- "}",
673
- "",
674
- "body[data-dsh-claude-style] table td, body[data-dsh-claude-style] table th {",
675
- " border: none;",
676
- " border-bottom: 1px solid rgba(20, 20, 19, 0.12);",
677
- " padding: 0.6em 0.85em !important;",
678
- "}",
679
730
  "",
680
731
  "/* tabs: subtle editorial weighting */",
681
732
  "body[data-dsh-claude-style] [role=\"tab\"] {",
@@ -2439,6 +2490,489 @@ window.__ModuleLoader__.load({
2439
2490
  " background: transparent;",
2440
2491
  "}",
2441
2492
  "",
2493
+ "/* The account row is the ban-screen easter egg's trigger",
2494
+ " (src/overrides/ban-screen.js). The header is only the wrapper — the clickable",
2495
+ " strip is the inner row, so the hover plate covers the name and not the divider",
2496
+ " that follows it. */",
2497
+ "body[data-dsh-claude-style] .dsh-claude-account-popover-row {",
2498
+ " padding: 6px 8px !important;",
2499
+ " border-radius: 8px !important;",
2500
+ " cursor: pointer !important;",
2501
+ " transition: background-color 0.12s ease !important;",
2502
+ "}",
2503
+ "body[data-dsh-claude-style] .dsh-claude-account-popover-row:hover,",
2504
+ "body[data-dsh-claude-style] .dsh-claude-account-popover-row:focus-visible {",
2505
+ " background: var(--dsh-claude-hover-bg, rgba(0, 0, 0, 0.08)) !important;",
2506
+ " outline: none !important;",
2507
+ "}",
2508
+ "",
2509
+ "/* The rule under the account name belongs to the POPOVER, not to the row: it",
2510
+ " spans the panel's full width (the negative inline margins cancel the popover's",
2511
+ " 6px padding) and sits outside the hover plate above. */",
2512
+ "body[data-dsh-claude-style] .dsh-claude-account-popover-header .dsh-claude-account-popover-divider {",
2513
+ " margin: 0 -6px !important;",
2514
+ "}",
2515
+ "",
2516
+ "/* ---------- Claude Code layout: account-ban easter egg ---------- */",
2517
+ "/* A reproduction of Claude's own \"Your account is on hold\" page, shown when the",
2518
+ " account row at the top of the sidebar's account popover is clicked. It is an",
2519
+ " easter egg, not a real state (src/overrides/ban-screen.js), and it is a",
2520
+ " full-window overlay rather than a page: `position: fixed` at the top of the",
2521
+ " stacking order, so it covers the titlebar, sidebar and composer whatever the",
2522
+ " host paints underneath, and can never be clipped by the sidebar column the",
2523
+ " account popover itself has to dodge.",
2524
+ "",
2525
+ " Palette: the page is Claude's ivory canvas, so the light rules carry the",
2526
+ " measurements and the dark theme re-maps the same slots onto the skin's warm",
2527
+ " black. Every colour is a custom property, which is what lets one set of rules",
2528
+ " serve both canvases. */",
2529
+ "body[data-dsh-claude-style] .dsh-claude-ban {",
2530
+ " --dsh-ban-canvas: #faf9f5;",
2531
+ " --dsh-ban-text: #141413;",
2532
+ " --dsh-ban-muted: #6e6a60;",
2533
+ " --dsh-ban-card: #ffffff;",
2534
+ " --dsh-ban-hairline: #e4e2d8;",
2535
+ " --dsh-ban-hover: rgba(20, 20, 19, 0.05);",
2536
+ " --dsh-ban-primary-fill: #141413;",
2537
+ " --dsh-ban-primary-text: #faf9f5;",
2538
+ " --dsh-ban-primary-hover: #2e2c29;",
2539
+ " --dsh-ban-danger: #a8412b;",
2540
+ " --dsh-ban-danger-hover: #8f3623;",
2541
+ " --dsh-ban-toast-bg: #f6e3c0;",
2542
+ " --dsh-ban-toast-border: #e6cfa1;",
2543
+ " --dsh-ban-toast-text: #7a4f12;",
2544
+ " --dsh-ban-toast-icon: #9a5a15;",
2545
+ " --dsh-ban-toast-hover: rgba(20, 20, 19, 0.09);",
2546
+ " /* The two brand marks are alpha masks over these slots, so the starburst",
2547
+ " keeps the clay accent while the wordmark stays in the page's ink. */",
2548
+ " --dsh-ban-mark: #d97757;",
2549
+ " --dsh-ban-word: #141413;",
2550
+ " position: fixed !important;",
2551
+ " inset: 0 !important;",
2552
+ " z-index: 2147483000 !important;",
2553
+ " margin: 0 !important;",
2554
+ " padding: 0 !important;",
2555
+ " background: var(--dsh-ban-canvas) !important;",
2556
+ " color: var(--dsh-ban-text);",
2557
+ " font-family: var(--dsw-font-family);",
2558
+ " font-size: 15px;",
2559
+ " line-height: 1.6;",
2560
+ " -webkit-font-smoothing: antialiased;",
2561
+ " box-sizing: border-box;",
2562
+ "}",
2563
+ "",
2564
+ "body[data-dsh-claude-style][data-ds-dark-theme] .dsh-claude-ban {",
2565
+ " --dsh-ban-canvas: #141413;",
2566
+ " --dsh-ban-text: #faf9f5;",
2567
+ " --dsh-ban-muted: #b0aea5;",
2568
+ " --dsh-ban-card: #1c1b1a;",
2569
+ " --dsh-ban-hairline: #2e2c29;",
2570
+ " --dsh-ban-hover: rgba(255, 255, 255, 0.07);",
2571
+ " --dsh-ban-primary-fill: #faf9f5;",
2572
+ " --dsh-ban-primary-text: #141413;",
2573
+ " --dsh-ban-primary-hover: #e8e6dc;",
2574
+ " --dsh-ban-danger: #e08a6d;",
2575
+ " --dsh-ban-danger-hover: #eb9f84;",
2576
+ " --dsh-ban-toast-bg: #3a2a22;",
2577
+ " --dsh-ban-toast-border: #55402f;",
2578
+ " --dsh-ban-toast-text: #f0d8b8;",
2579
+ " --dsh-ban-toast-icon: #e0a86a;",
2580
+ " --dsh-ban-toast-hover: rgba(255, 255, 255, 0.08);",
2581
+ " --dsh-ban-word: #faf9f5;",
2582
+ "}",
2583
+ "",
2584
+ "body[data-dsh-claude-style] .dsh-claude-ban *,",
2585
+ "body[data-dsh-claude-style] .dsh-claude-ban *::before,",
2586
+ "body[data-dsh-claude-style] .dsh-claude-ban *::after {",
2587
+ " box-sizing: border-box;",
2588
+ "}",
2589
+ "",
2590
+ "body[data-dsh-claude-style] .dsh-claude-ban svg {",
2591
+ " display: block;",
2592
+ " width: 100%;",
2593
+ " height: 100%;",
2594
+ "}",
2595
+ "",
2596
+ "/* ---------- top bar: brand lockup, sign out, window controls ---------- */",
2597
+ "/* The bar sits 30px down from the window edge: it reproduces the shipped app's",
2598
+ " own titlebar row, which the real Claude page keeps clear of. */",
2599
+ "body[data-dsh-claude-style] .dsh-claude-ban-bar {",
2600
+ " display: flex;",
2601
+ " align-items: center;",
2602
+ " justify-content: space-between;",
2603
+ " gap: 16px;",
2604
+ " padding: 40px 8px 10px 44px;",
2605
+ "}",
2606
+ "",
2607
+ "body[data-dsh-claude-style] .dsh-claude-ban-brand {",
2608
+ " display: flex;",
2609
+ " align-items: center;",
2610
+ " gap: 8px;",
2611
+ " color: var(--dsh-ban-word);",
2612
+ "}",
2613
+ "",
2614
+ "body[data-dsh-claude-style] .dsh-claude-ban-mark {",
2615
+ " flex: none;",
2616
+ " width: 21px;",
2617
+ " height: 21px;",
2618
+ " background-color: var(--dsh-ban-mark);",
2619
+ " -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20148.09%20148.18'%3E%3Cg%20transform%3D'translate(-75.96%2C-223.53)'%3E%3Cpath%20d%3D'm%20105.01%2C322.07%2029.14%2C-16.35%200.49%2C-1.42%20-0.49%2C-0.79%20h%20-1.42%20l%20-4.87%2C-0.3%20-16.65%2C-0.45%20-14.44%2C-0.6%20-13.99%2C-0.75%20-3.52%2C-0.75%20-3.3%2C-4.35%200.34%2C-2.17%202.96%2C-1.99%204.24%2C0.37%209.37%2C0.64%2014.06%2C0.97%2010.2%2C0.6%2015.11%2C1.57%20h%202.4%20l%200.34%2C-0.97%20-0.82%2C-0.6%20-0.64%2C-0.6%20-14.55%2C-9.86%20-15.75%2C-10.42%20-8.25%2C-6%20-4.46%2C-3.04%20-2.25%2C-2.85%20-0.97%2C-6.22%204.05%2C-4.46%205.44%2C0.37%201.39%2C0.37%205.51%2C4.24%2011.77%2C9.11%2015.37%2C11.32%202.25%2C1.87%200.9%2C-0.64%200.11%2C-0.45%20-1.01%2C-1.69%20-8.36%2C-15.11%20-8.92%2C-15.37%20-3.97%2C-6.37%20-1.05%2C-3.82%20c%20-0.37%2C-1.57%20-0.64%2C-2.89%20-0.64%2C-4.5%20l%204.61%2C-6.26%202.55%2C-0.82%206.15%2C0.82%202.59%2C2.25%203.82%2C8.74%206.19%2C13.76%209.6%2C18.71%202.81%2C5.55%201.5%2C5.14%200.56%2C1.57%20h%200.97%20v%20-0.9%20l%200.79%2C-10.54%201.46%2C-12.94%201.42%2C-16.65%200.49%2C-4.69%202.32%2C-5.62%204.61%2C-3.04%203.6%2C1.72%202.96%2C4.24%20-0.41%2C2.74%20-1.76%2C11.44%20-3.45%2C17.92%20-2.25%2C12%20h%201.31%20l%201.5%2C-1.5%206.07%2C-8.06%2010.2%2C-12.75%204.5%2C-5.06%205.25%2C-5.59%203.37%2C-2.66%20h%206.37%20l%204.69%2C6.97%20-2.1%2C7.2%20-6.56%2C8.32%20-5.44%2C7.05%20-7.8%2C10.5%20-4.87%2C8.4%200.45%2C0.67%201.16%2C-0.11%2017.62%2C-3.75%209.52%2C-1.72%2011.36%2C-1.95%205.14%2C2.4%200.56%2C2.44%20-2.02%2C4.99%20-12.15%2C3%20-14.25%2C2.85%20-21.22%2C5.02%20-0.26%2C0.19%200.3%2C0.37%209.56%2C0.9%204.09%2C0.22%20h%2010.01%20l%2018.64%2C1.39%204.87%2C3.22%202.92%2C3.94%20-0.49%2C3%20-7.5%2C3.82%20-10.12%2C-2.4%20-23.62%2C-5.62%20-8.1%2C-2.02%20h%20-1.12%20v%200.67%20l%206.75%2C6.6%2012.37%2C11.17%2015.49%2C14.4%200.79%2C3.56%20-1.99%2C2.81%20-2.1%2C-0.3%20-13.61%2C-10.24%20-5.25%2C-4.61%20-11.89%2C-10.01%20h%20-0.79%20v%201.05%20l%202.74%2C4.01%2014.47%2C21.75%200.75%2C6.67%20-1.05%2C2.17%20-3.75%2C1.31%20-4.12%2C-0.75%20-8.47%2C-11.89%20-8.74%2C-13.39%20-7.05%2C-12%20-0.86%2C0.49%20-4.16%2C44.81%20-1.95%2C2.29%20-4.5%2C1.72%20-3.75%2C-2.85%20-1.99%2C-4.61%201.99%2C-9.11%202.4%2C-11.89%201.95%2C-9.45%201.76%2C-11.74%201.05%2C-3.9%20-0.07%2C-0.26%20-0.86%2C0.11%20-8.85%2C12.15%20-13.46%2C18.19%20-10.65%2C11.4%20-2.55%2C1.01%20-4.42%2C-2.29%200.41%2C-4.09%202.47%2C-3.64%2014.74%2C-18.75%208.89%2C-11.62%205.74%2C-6.71%20-0.04%2C-0.97%20h%20-0.34%20l%20-39.15%2C25.42%20-6.97%2C0.9%20-3%2C-2.81%200.37%2C-4.61%201.42%2C-1.5%2011.77%2C-8.1%20-0.04%2C0.04%20z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2620
+ " mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20148.09%20148.18'%3E%3Cg%20transform%3D'translate(-75.96%2C-223.53)'%3E%3Cpath%20d%3D'm%20105.01%2C322.07%2029.14%2C-16.35%200.49%2C-1.42%20-0.49%2C-0.79%20h%20-1.42%20l%20-4.87%2C-0.3%20-16.65%2C-0.45%20-14.44%2C-0.6%20-13.99%2C-0.75%20-3.52%2C-0.75%20-3.3%2C-4.35%200.34%2C-2.17%202.96%2C-1.99%204.24%2C0.37%209.37%2C0.64%2014.06%2C0.97%2010.2%2C0.6%2015.11%2C1.57%20h%202.4%20l%200.34%2C-0.97%20-0.82%2C-0.6%20-0.64%2C-0.6%20-14.55%2C-9.86%20-15.75%2C-10.42%20-8.25%2C-6%20-4.46%2C-3.04%20-2.25%2C-2.85%20-0.97%2C-6.22%204.05%2C-4.46%205.44%2C0.37%201.39%2C0.37%205.51%2C4.24%2011.77%2C9.11%2015.37%2C11.32%202.25%2C1.87%200.9%2C-0.64%200.11%2C-0.45%20-1.01%2C-1.69%20-8.36%2C-15.11%20-8.92%2C-15.37%20-3.97%2C-6.37%20-1.05%2C-3.82%20c%20-0.37%2C-1.57%20-0.64%2C-2.89%20-0.64%2C-4.5%20l%204.61%2C-6.26%202.55%2C-0.82%206.15%2C0.82%202.59%2C2.25%203.82%2C8.74%206.19%2C13.76%209.6%2C18.71%202.81%2C5.55%201.5%2C5.14%200.56%2C1.57%20h%200.97%20v%20-0.9%20l%200.79%2C-10.54%201.46%2C-12.94%201.42%2C-16.65%200.49%2C-4.69%202.32%2C-5.62%204.61%2C-3.04%203.6%2C1.72%202.96%2C4.24%20-0.41%2C2.74%20-1.76%2C11.44%20-3.45%2C17.92%20-2.25%2C12%20h%201.31%20l%201.5%2C-1.5%206.07%2C-8.06%2010.2%2C-12.75%204.5%2C-5.06%205.25%2C-5.59%203.37%2C-2.66%20h%206.37%20l%204.69%2C6.97%20-2.1%2C7.2%20-6.56%2C8.32%20-5.44%2C7.05%20-7.8%2C10.5%20-4.87%2C8.4%200.45%2C0.67%201.16%2C-0.11%2017.62%2C-3.75%209.52%2C-1.72%2011.36%2C-1.95%205.14%2C2.4%200.56%2C2.44%20-2.02%2C4.99%20-12.15%2C3%20-14.25%2C2.85%20-21.22%2C5.02%20-0.26%2C0.19%200.3%2C0.37%209.56%2C0.9%204.09%2C0.22%20h%2010.01%20l%2018.64%2C1.39%204.87%2C3.22%202.92%2C3.94%20-0.49%2C3%20-7.5%2C3.82%20-10.12%2C-2.4%20-23.62%2C-5.62%20-8.1%2C-2.02%20h%20-1.12%20v%200.67%20l%206.75%2C6.6%2012.37%2C11.17%2015.49%2C14.4%200.79%2C3.56%20-1.99%2C2.81%20-2.1%2C-0.3%20-13.61%2C-10.24%20-5.25%2C-4.61%20-11.89%2C-10.01%20h%20-0.79%20v%201.05%20l%202.74%2C4.01%2014.47%2C21.75%200.75%2C6.67%20-1.05%2C2.17%20-3.75%2C1.31%20-4.12%2C-0.75%20-8.47%2C-11.89%20-8.74%2C-13.39%20-7.05%2C-12%20-0.86%2C0.49%20-4.16%2C44.81%20-1.95%2C2.29%20-4.5%2C1.72%20-3.75%2C-2.85%20-1.99%2C-4.61%201.99%2C-9.11%202.4%2C-11.89%201.95%2C-9.45%201.76%2C-11.74%201.05%2C-3.9%20-0.07%2C-0.26%20-0.86%2C0.11%20-8.85%2C12.15%20-13.46%2C18.19%20-10.65%2C11.4%20-2.55%2C1.01%20-4.42%2C-2.29%200.41%2C-4.09%202.47%2C-3.64%2014.74%2C-18.75%208.89%2C-11.62%205.74%2C-6.71%20-0.04%2C-0.97%20h%20-0.34%20l%20-39.15%2C25.42%20-6.97%2C0.9%20-3%2C-2.81%200.37%2C-4.61%201.42%2C-1.5%2011.77%2C-8.1%20-0.04%2C0.04%20z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2621
+ "}",
2622
+ "",
2623
+ "body[data-dsh-claude-style] .dsh-claude-ban-word {",
2624
+ " flex: none;",
2625
+ " width: 89px;",
2626
+ " height: 21px;",
2627
+ " background-color: var(--dsh-ban-word);",
2628
+ " -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'177.76%2014.09%20512.22%20121.54'%3E%3Cg%20transform%3D'translate(-75.96%2C-223.53)'%3E%3Cpath%20d%3D'm%20317.73%2C349.33%20c%20-18.82%2C0%20-31.69%2C-10.5%20-37.76%2C-26.66%20-3.17%2C-8.42%20-4.74%2C-17.36%20-4.61%2C-26.36%200%2C-27.11%2012.15%2C-45.94%2039%2C-45.94%2018.04%2C0%2029.17%2C7.87%2035.51%2C26.66%20h%207.72%20l%20-1.05%2C-25.91%20c%20-10.8%2C-6.97%20-24.3%2C-10.5%20-40.72%2C-10.5%20-23.14%2C0%20-42.82%2C10.35%20-53.77%2C29.02%20-5.66%2C9.86%20-8.53%2C21.07%20-8.32%2C32.44%200%2C20.74%209.79%2C39.11%2028.16%2C49.31%2010.06%2C5.37%2021.34%2C8.04%2032.74%2C7.72%2017.92%2C0%2032.14%2C-3.41%2044.74%2C-9.37%20l%203.26%2C-28.57%20h%20-7.87%20c%20-4.72%2C13.05%20-10.35%2C20.89%20-19.69%2C25.05%20-4.57%2C2.06%20-10.35%2C3.11%20-17.32%2C3.11%20z%20m%2081.18%2C-98.96%200.75%2C-12.75%20h%20-5.32%20l%20-23.7%2C7.12%20v%203.86%20l%2010.5%2C4.87%20v%2089.17%20c%200%2C6.07%20-3.11%2C7.42%20-11.25%2C8.44%20v%206.52%20h%2040.31%20v%20-6.52%20c%20-8.17%2C-1.01%20-11.25%2C-2.36%20-11.25%2C-8.44%20V%20250.4%20l%20-0.04%2C-0.04%20z%20m%20160.31%2C108.75%20h%203.11%20l%2027.26%2C-5.17%20v%20-6.67%20l%20-3.82%2C-0.3%20c%20-6.37%2C-0.6%20-8.02%2C-1.91%20-8.02%2C-7.12%20v%20-47.55%20l%200.75%2C-15.26%20h%20-4.31%20l%20-25.76%2C3.71%20v%206.52%20l%202.51%2C0.45%20c%206.97%2C1.01%209.04%2C2.96%209.04%2C7.84%20v%2042.37%20c%20-6.67%2C5.17%20-13.05%2C8.44%20-20.62%2C8.44%20-8.4%2C0%20-13.61%2C-4.27%20-13.61%2C-14.25%20v%20-39.79%20l%200.75%2C-15.26%20h%20-4.42%20l%20-25.8%2C3.71%20v%206.52%20l%202.66%2C0.45%20c%206.97%2C1.01%209.04%2C2.96%209.04%2C7.84%20v%2039.11%20c%200%2C16.57%209.37%2C24.45%2024.3%2C24.45%2011.4%2C0%2020.74%2C-6.07%2027.75%2C-14.51%20l%20-0.75%2C14.51%20-0.04%2C-0.04%20z%20M%20484.3%2C306.36%20c%200%2C-21.19%20-11.25%2C-29.32%20-31.57%2C-29.32%20-17.92%2C0%20-30.94%2C7.42%20-30.94%2C19.72%200%2C3.67%201.31%2C6.49%203.97%2C8.44%20l%2013.65%2C-1.8%20c%20-0.6%2C-4.12%20-0.9%2C-6.64%20-0.9%2C-7.69%200%2C-6.97%203.71%2C-10.5%2011.25%2C-10.5%2011.14%2C0%2016.76%2C7.84%2016.76%2C20.44%20v%204.12%20l%20-28.12%2C8.44%20c%20-9.37%2C2.55%20-14.7%2C4.76%20-18.26%2C9.94%20-1.89%2C3.17%20-2.8%2C6.82%20-2.62%2C10.5%200%2C12%208.25%2C20.47%2022.35%2C20.47%2010.2%2C0%2019.24%2C-4.61%2027.11%2C-13.35%202.81%2C8.74%207.12%2C13.35%2014.81%2C13.35%206.22%2C0%2011.85%2C-2.51%2016.87%2C-7.42%20l%20-1.5%2C-5.17%20c%20-2.17%2C0.6%20-4.27%2C0.9%20-6.49%2C0.9%20-4.31%2C0%20-6.37%2C-3.41%20-6.37%2C-10.09%20v%20-30.97%20z%20m%20-36%2C40.76%20c%20-7.69%2C0%20-12.45%2C-4.46%20-12.45%2C-12.3%200%2C-5.32%202.51%2C-8.44%207.87%2C-10.24%20l%2022.8%2C-7.24%20v%2021.9%20c%20-7.27%2C5.51%20-11.55%2C7.87%20-18.22%2C7.87%20z%20m%20237.36%2C6.82%20v%20-6.67%20l%20-3.86%2C-0.3%20c%20-6.37%2C-0.6%20-7.99%2C-1.91%20-7.99%2C-7.12%20v%20-89.47%20l%200.75%2C-12.75%20h%20-5.36%20l%20-23.7%2C7.12%20v%203.86%20l%2010.5%2C4.87%20v%2029.32%20c%20-5.91%2C-4.05%20-12.98%2C-6.08%20-20.14%2C-5.77%20-23.55%2C0%20-41.92%2C17.92%20-41.92%2C44.74%200%2C22.09%2013.2%2C37.35%2034.95%2C37.35%2011.25%2C0%2021.04%2C-5.47%2027.11%2C-13.95%20l%20-0.75%2C13.95%20h%203.15%20l%2027.26%2C-5.17%20v%200%20z%20m%20-49.35%2C-68.02%20c%2011.25%2C0%2019.69%2C6.52%2019.69%2C18.52%20v%2033.75%20c%20-5.18%2C5.16%20-12.23%2C8%20-19.54%2C7.87%20-16.12%2C0%20-24.3%2C-12.75%20-24.3%2C-29.77%200%2C-19.12%209.34%2C-30.37%2024.15%2C-30.37%20z%20M%20743.3%2C302.8%20c%20-2.1%2C-9.9%20-8.17%2C-15.52%20-16.61%2C-15.52%20-12.6%2C0%20-21.34%2C9.49%20-21.34%2C23.1%200%2C20.14%2010.65%2C33.19%2027.86%2C33.19%2011.48%2C-0.12%2022.04%2C-6.33%2027.71%2C-16.31%20l%205.02%2C1.35%20c%20-2.25%2C17.47%20-18.07%2C30.52%20-37.5%2C30.52%20-22.8%2C0%20-38.51%2C-16.87%20-38.51%2C-40.87%200%2C-24%2017.06%2C-41.21%2039.86%2C-41.21%2017.02%2C0%2029.02%2C10.24%2032.89%2C28.01%20l%20-59.4%2C18.22%20v%20-8.02%20l%2040.01%2C-12.41%20v%20-0.04%20z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2629
+ " mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'177.76%2014.09%20512.22%20121.54'%3E%3Cg%20transform%3D'translate(-75.96%2C-223.53)'%3E%3Cpath%20d%3D'm%20317.73%2C349.33%20c%20-18.82%2C0%20-31.69%2C-10.5%20-37.76%2C-26.66%20-3.17%2C-8.42%20-4.74%2C-17.36%20-4.61%2C-26.36%200%2C-27.11%2012.15%2C-45.94%2039%2C-45.94%2018.04%2C0%2029.17%2C7.87%2035.51%2C26.66%20h%207.72%20l%20-1.05%2C-25.91%20c%20-10.8%2C-6.97%20-24.3%2C-10.5%20-40.72%2C-10.5%20-23.14%2C0%20-42.82%2C10.35%20-53.77%2C29.02%20-5.66%2C9.86%20-8.53%2C21.07%20-8.32%2C32.44%200%2C20.74%209.79%2C39.11%2028.16%2C49.31%2010.06%2C5.37%2021.34%2C8.04%2032.74%2C7.72%2017.92%2C0%2032.14%2C-3.41%2044.74%2C-9.37%20l%203.26%2C-28.57%20h%20-7.87%20c%20-4.72%2C13.05%20-10.35%2C20.89%20-19.69%2C25.05%20-4.57%2C2.06%20-10.35%2C3.11%20-17.32%2C3.11%20z%20m%2081.18%2C-98.96%200.75%2C-12.75%20h%20-5.32%20l%20-23.7%2C7.12%20v%203.86%20l%2010.5%2C4.87%20v%2089.17%20c%200%2C6.07%20-3.11%2C7.42%20-11.25%2C8.44%20v%206.52%20h%2040.31%20v%20-6.52%20c%20-8.17%2C-1.01%20-11.25%2C-2.36%20-11.25%2C-8.44%20V%20250.4%20l%20-0.04%2C-0.04%20z%20m%20160.31%2C108.75%20h%203.11%20l%2027.26%2C-5.17%20v%20-6.67%20l%20-3.82%2C-0.3%20c%20-6.37%2C-0.6%20-8.02%2C-1.91%20-8.02%2C-7.12%20v%20-47.55%20l%200.75%2C-15.26%20h%20-4.31%20l%20-25.76%2C3.71%20v%206.52%20l%202.51%2C0.45%20c%206.97%2C1.01%209.04%2C2.96%209.04%2C7.84%20v%2042.37%20c%20-6.67%2C5.17%20-13.05%2C8.44%20-20.62%2C8.44%20-8.4%2C0%20-13.61%2C-4.27%20-13.61%2C-14.25%20v%20-39.79%20l%200.75%2C-15.26%20h%20-4.42%20l%20-25.8%2C3.71%20v%206.52%20l%202.66%2C0.45%20c%206.97%2C1.01%209.04%2C2.96%209.04%2C7.84%20v%2039.11%20c%200%2C16.57%209.37%2C24.45%2024.3%2C24.45%2011.4%2C0%2020.74%2C-6.07%2027.75%2C-14.51%20l%20-0.75%2C14.51%20-0.04%2C-0.04%20z%20M%20484.3%2C306.36%20c%200%2C-21.19%20-11.25%2C-29.32%20-31.57%2C-29.32%20-17.92%2C0%20-30.94%2C7.42%20-30.94%2C19.72%200%2C3.67%201.31%2C6.49%203.97%2C8.44%20l%2013.65%2C-1.8%20c%20-0.6%2C-4.12%20-0.9%2C-6.64%20-0.9%2C-7.69%200%2C-6.97%203.71%2C-10.5%2011.25%2C-10.5%2011.14%2C0%2016.76%2C7.84%2016.76%2C20.44%20v%204.12%20l%20-28.12%2C8.44%20c%20-9.37%2C2.55%20-14.7%2C4.76%20-18.26%2C9.94%20-1.89%2C3.17%20-2.8%2C6.82%20-2.62%2C10.5%200%2C12%208.25%2C20.47%2022.35%2C20.47%2010.2%2C0%2019.24%2C-4.61%2027.11%2C-13.35%202.81%2C8.74%207.12%2C13.35%2014.81%2C13.35%206.22%2C0%2011.85%2C-2.51%2016.87%2C-7.42%20l%20-1.5%2C-5.17%20c%20-2.17%2C0.6%20-4.27%2C0.9%20-6.49%2C0.9%20-4.31%2C0%20-6.37%2C-3.41%20-6.37%2C-10.09%20v%20-30.97%20z%20m%20-36%2C40.76%20c%20-7.69%2C0%20-12.45%2C-4.46%20-12.45%2C-12.3%200%2C-5.32%202.51%2C-8.44%207.87%2C-10.24%20l%2022.8%2C-7.24%20v%2021.9%20c%20-7.27%2C5.51%20-11.55%2C7.87%20-18.22%2C7.87%20z%20m%20237.36%2C6.82%20v%20-6.67%20l%20-3.86%2C-0.3%20c%20-6.37%2C-0.6%20-7.99%2C-1.91%20-7.99%2C-7.12%20v%20-89.47%20l%200.75%2C-12.75%20h%20-5.36%20l%20-23.7%2C7.12%20v%203.86%20l%2010.5%2C4.87%20v%2029.32%20c%20-5.91%2C-4.05%20-12.98%2C-6.08%20-20.14%2C-5.77%20-23.55%2C0%20-41.92%2C17.92%20-41.92%2C44.74%200%2C22.09%2013.2%2C37.35%2034.95%2C37.35%2011.25%2C0%2021.04%2C-5.47%2027.11%2C-13.95%20l%20-0.75%2C13.95%20h%203.15%20l%2027.26%2C-5.17%20v%200%20z%20m%20-49.35%2C-68.02%20c%2011.25%2C0%2019.69%2C6.52%2019.69%2C18.52%20v%2033.75%20c%20-5.18%2C5.16%20-12.23%2C8%20-19.54%2C7.87%20-16.12%2C0%20-24.3%2C-12.75%20-24.3%2C-29.77%200%2C-19.12%209.34%2C-30.37%2024.15%2C-30.37%20z%20M%20743.3%2C302.8%20c%20-2.1%2C-9.9%20-8.17%2C-15.52%20-16.61%2C-15.52%20-12.6%2C0%20-21.34%2C9.49%20-21.34%2C23.1%200%2C20.14%2010.65%2C33.19%2027.86%2C33.19%2011.48%2C-0.12%2022.04%2C-6.33%2027.71%2C-16.31%20l%205.02%2C1.35%20c%20-2.25%2C17.47%20-18.07%2C30.52%20-37.5%2C30.52%20-22.8%2C0%20-38.51%2C-16.87%20-38.51%2C-40.87%200%2C-24%2017.06%2C-41.21%2039.86%2C-41.21%2017.02%2C0%2029.02%2C10.24%2032.89%2C28.01%20l%20-59.4%2C18.22%20v%20-8.02%20l%2040.01%2C-12.41%20v%20-0.04%20z'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2630
+ "}",
2631
+ "",
2632
+ "/* The brand preference applies here too: Anthropic swaps both marks, and \"off\"",
2633
+ " keeps the Claude lockup with the starburst dropped (a bare text wordmark is",
2634
+ " exactly what this page is). */",
2635
+ "body[data-dsh-claude-style][data-dsh-claude-brand=\"anthropic\"] .dsh-claude-ban-mark {",
2636
+ " width: 30px;",
2637
+ " background-color: var(--dsh-ban-word);",
2638
+ " -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2046%2032'%3E%3Cpath%20d%3D'M32.73%200H25.7846L38.4499%2032H45.3953L32.73%200Z'%2F%3E%3Cpath%20d%3D'M12.6653%200L0%2032H7.08167L9.67193%2025.28H22.9219L25.5122%2032H32.5939L19.9286%200H12.6653ZM11.9626%2019.3371L16.2969%208.09143L20.6313%2019.3371H11.9626Z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2639
+ " mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2046%2032'%3E%3Cpath%20d%3D'M32.73%200H25.7846L38.4499%2032H45.3953L32.73%200Z'%2F%3E%3Cpath%20d%3D'M12.6653%200L0%2032H7.08167L9.67193%2025.28H22.9219L25.5122%2032H32.5939L19.9286%200H12.6653ZM11.9626%2019.3371L16.2969%208.09143L20.6313%2019.3371H11.9626Z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2640
+ "}",
2641
+ "",
2642
+ "body[data-dsh-claude-style][data-dsh-claude-brand=\"anthropic\"] .dsh-claude-ban-word {",
2643
+ " width: 188px;",
2644
+ " -webkit-mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20143%2016'%3E%3Cpath%20transform%3D'translate(18.299999237060547%2C0.27000001072883606)'%20d%3D'%20M10.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%203.756195545196533%2C0%203.756195545196533%2C0%20C3.756195545196533%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%20C3.2038140296936035%2C15.470022201538086%203.2038140296936035%2C4.6410064697265625%203.2038140296936035%2C4.6410064697265625%20C3.2038140296936035%2C4.6410064697265625%2010.163809776306152%2C15.470022201538086%2010.163809776306152%2C15.470022201538086%20C10.163809776306152%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.716191291809082%2C0%2010.716191291809082%2C0%20C10.716191291809082%2C0%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777z'%2F%3E%3Cpath%20transform%3D'translate(34.869998931884766%2C0.27000001072883606)'%20d%3D'%20M0%2C2.983504056930542%20C0%2C2.983504056930542%205.19273567199707%2C2.983504056930542%205.19273567199707%2C2.983504056930542%20C5.19273567199707%2C2.983504056930542%205.19273567199707%2C15.470022201538086%205.19273567199707%2C15.470022201538086%20C5.19273567199707%2C15.470022201538086%208.507256507873535%2C15.470022201538086%208.507256507873535%2C15.470022201538086%20C8.507256507873535%2C15.470022201538086%208.507256507873535%2C2.983504056930542%208.507256507873535%2C2.983504056930542%20C8.507256507873535%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%20C13.700006484985352%2C2.983504056930542%2013.700006484985352%2C0%2013.700006484985352%2C0%20C13.700006484985352%2C0%200%2C0%200%2C0%20C0%2C0%200%2C2.983504056930542%200%2C2.983504056930542%20C0%2C2.983504056930542%200%2C2.983504056930542%200%2C2.983504056930542z'%2F%3E%3Cpath%20transform%3D'translate(51.22999954223633%2C0.27000001072883606)'%20d%3D'%20M10.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%20C3.3142902851104736%2C6.165900230407715%203.3142902851104736%2C0%203.3142902851104736%2C0%20C3.3142902851104736%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%20C3.3142902851104736%2C15.470022201538086%203.3142902851104736%2C9.149404525756836%203.3142902851104736%2C9.149404525756836%20C3.3142902851104736%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%20C10.605714797973633%2C9.149404525756836%2010.605714797973633%2C15.470022201538086%2010.605714797973633%2C15.470022201538086%20C10.605714797973633%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.605714797973633%2C0%2010.605714797973633%2C0%20C10.605714797973633%2C0%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715z'%2F%3E%3Cpath%20transform%3D'translate(69.23999786376953%2C0.27000001072883606)'%20d%3D'%20M3.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%207.403865814208984%2C2.983504056930542%207.403865814208984%2C2.983504056930542%20C9.03934097290039%2C2.983504056930542%209.901290893554688%2C3.5801939964294434%209.901290893554688%2C4.707304000854492%20C9.901290893554688%2C5.834399700164795%209.03934097290039%2C6.431103706359863%207.403865814208984%2C6.431103706359863%20C7.403865814208984%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%20C3.3151700496673584%2C6.431103706359863%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542z%20M13.216461181640625%2C4.707304000854492%20C13.216461181640625%2C1.7900969982147217%2011.072648048400879%2C0%207.558576583862305%2C0%20C7.558576583862305%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%20C3.3151700496673584%2C15.470022201538086%203.3151700496673584%2C9.414593696594238%203.3151700496673584%2C9.414593696594238%20C3.3151700496673584%2C9.414593696594238%207.005825519561768%2C9.414593696594238%207.005825519561768%2C9.414593696594238%20C7.005825519561768%2C9.414593696594238%2010.321218490600586%2C15.470022201538086%2010.321218490600586%2C15.470022201538086%20C10.321218490600586%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%20C13.990056991577148%2C15.470022201538086%2010.319005966186523%2C8.953378677368164%2010.319005966186523%2C8.953378677368164%20C12.161579132080078%2C8.245061874389648%2013.216461181640625%2C6.753532409667969%2013.216461181640625%2C4.707304000854492%20C13.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492z'%2F%3E%3Cpath%20transform%3D'translate(84.98999786376953%2C0)'%20d%3D'%20M7.622087478637695%2C12.906073570251465%20C5.015110492706299%2C12.906073570251465%203.4244225025177%2C11.049725532531738%203.4244225025177%2C8.022093772888184%20C3.4244225025177%2C4.95027494430542%205.015110492706299%2C3.0939269065856934%207.622087478637695%2C3.0939269065856934%20C10.206976890563965%2C3.0939269065856934%2011.775577545166016%2C4.95027494430542%2011.775577545166016%2C8.022093772888184%20C11.775577545166016%2C11.049725532531738%2010.206976890563965%2C12.906073570251465%207.622087478637695%2C12.906073570251465%20C7.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465z%20M7.622087478637695%2C0%20C3.1593029499053955%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1593029499053955%2C16%207.622087478637695%2C16%20C12.062784194946289%2C16%2015.200028419494629%2C12.685078620910645%2015.200028419494629%2C8.022093772888184%20C15.200028419494629%2C3.3149218559265137%2012.062784194946289%2C0%207.622087478637695%2C0%20C7.622087478637695%2C0%207.622087478637695%2C0%207.622087478637695%2C0z'%2F%3E%3Cpath%20transform%3D'translate(103.29000091552734%2C0.27000001072883606)'%20d%3D'%20M7.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%20C3.3160574436187744%2C6.873104095458984%203.3160574436187744%2C2.983504056930542%203.3160574436187744%2C2.983504056930542%20C3.3160574436187744%2C2.983504056930542%207.405848026275635%2C2.983504056930542%207.405848026275635%2C2.983504056930542%20C9.04176139831543%2C2.983504056930542%209.90394115447998%2C3.646505117416382%209.90394115447998%2C4.928304195404053%20C9.90394115447998%2C6.2101030349731445%209.04176139831543%2C6.873104095458984%207.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984z%20M7.5605998039245605%2C0%20C7.5605998039245605%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%20C3.3160574436187744%2C15.470022201538086%203.3160574436187744%2C9.85659408569336%203.3160574436187744%2C9.85659408569336%20C3.3160574436187744%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%20C11.07561206817627%2C9.85659408569336%2013.219999313354492%2C8.000200271606445%2013.219999313354492%2C4.928304195404053%20C13.219999313354492%2C1.8563942909240723%2011.07561206817627%2C0%207.5605998039245605%2C0%20C7.5605998039245605%2C0%207.5605998039245605%2C0%207.5605998039245605%2C0z'%2F%3E%3Cpath%20transform%3D'translate(128.0399932861328%2C0)'%20d%3D'%20M10.914844512939453%2C10.5414400100708%20C10.340370178222656%2C12.044201850891113%209.191434860229492%2C12.906073570251465%207.622706890106201%2C12.906073570251465%20C5.0155181884765625%2C12.906073570251465%203.4246866703033447%2C11.049725532531738%203.4246866703033447%2C8.022093772888184%20C3.4246866703033447%2C4.95027494430542%205.0155181884765625%2C3.0939269065856934%207.622706890106201%2C3.0939269065856934%20C9.191434860229492%2C3.0939269065856934%2010.340370178222656%2C3.9557981491088867%2010.914844512939453%2C5.458559989929199%20C10.914844512939453%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%20C13.566211700439453%2C2.1436522006988525%2010.981111526489258%2C0%207.622706890106201%2C0%20C3.1595458984375%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1595458984375%2C16%207.622706890106201%2C16%20C11.003214836120605%2C16%2013.588300704956055%2C13.834254264831543%2014.449976921081543%2C10.5414400100708%20C14.449976921081543%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%20C10.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708z'%2F%3E%3Cpath%20transform%3D'translate(117.83000183105469%2C0.27000001072883606)'%20d%3D'%20M0%2C0%20C0%2C0%206.1677093505859375%2C15.470022201538086%206.1677093505859375%2C15.470022201538086%20C6.1677093505859375%2C15.470022201538086%209.550004005432129%2C15.470022201538086%209.550004005432129%2C15.470022201538086%20C9.550004005432129%2C15.470022201538086%203.382294178009033%2C0%203.382294178009033%2C0%20C3.382294178009033%2C0%200%2C0%200%2C0%20C0%2C0%200%2C0%200%2C0z'%2F%3E%3Cpath%20transform%3D'translate(0%2C0.27000001072883606)'%20d%3D'%20M5.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%207.93500280380249%2C3.911694288253784%207.93500280380249%2C3.911694288253784%20C7.93500280380249%2C3.911694288253784%2010.045400619506836%2C9.348296165466309%2010.045400619506836%2C9.348296165466309%20C10.045400619506836%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309z%20M6.166755199432373%2C0%20C6.166755199432373%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%20C3.4480772018432617%2C15.470022201538086%204.709278583526611%2C12.22130012512207%204.709278583526611%2C12.22130012512207%20C4.709278583526611%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%20C11.16093635559082%2C12.22130012512207%2012.421928405761719%2C15.470022201538086%2012.421928405761719%2C15.470022201538086%20C12.421928405761719%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%20C15.87000560760498%2C15.470022201538086%209.703250885009766%2C0%209.703250885009766%2C0%20C9.703250885009766%2C0%206.166755199432373%2C0%206.166755199432373%2C0%20C6.166755199432373%2C0%206.166755199432373%2C0%206.166755199432373%2C0z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2645
+ " mask: url(\"data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%20143%2016'%3E%3Cpath%20transform%3D'translate(18.299999237060547%2C0.27000001072883606)'%20d%3D'%20M10.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%203.756195545196533%2C0%203.756195545196533%2C0%20C3.756195545196533%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%203.2038140296936035%2C15.470022201538086%20C3.2038140296936035%2C15.470022201538086%203.2038140296936035%2C4.6410064697265625%203.2038140296936035%2C4.6410064697265625%20C3.2038140296936035%2C4.6410064697265625%2010.163809776306152%2C15.470022201538086%2010.163809776306152%2C15.470022201538086%20C10.163809776306152%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.716191291809082%2C0%2010.716191291809082%2C0%20C10.716191291809082%2C0%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%20C10.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777%2010.716191291809082%2C10.829001426696777z'%2F%3E%3Cpath%20transform%3D'translate(34.869998931884766%2C0.27000001072883606)'%20d%3D'%20M0%2C2.983504056930542%20C0%2C2.983504056930542%205.19273567199707%2C2.983504056930542%205.19273567199707%2C2.983504056930542%20C5.19273567199707%2C2.983504056930542%205.19273567199707%2C15.470022201538086%205.19273567199707%2C15.470022201538086%20C5.19273567199707%2C15.470022201538086%208.507256507873535%2C15.470022201538086%208.507256507873535%2C15.470022201538086%20C8.507256507873535%2C15.470022201538086%208.507256507873535%2C2.983504056930542%208.507256507873535%2C2.983504056930542%20C8.507256507873535%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%2013.700006484985352%2C2.983504056930542%20C13.700006484985352%2C2.983504056930542%2013.700006484985352%2C0%2013.700006484985352%2C0%20C13.700006484985352%2C0%200%2C0%200%2C0%20C0%2C0%200%2C2.983504056930542%200%2C2.983504056930542%20C0%2C2.983504056930542%200%2C2.983504056930542%200%2C2.983504056930542z'%2F%3E%3Cpath%20transform%3D'translate(51.22999954223633%2C0.27000001072883606)'%20d%3D'%20M10.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%203.3142902851104736%2C6.165900230407715%20C3.3142902851104736%2C6.165900230407715%203.3142902851104736%2C0%203.3142902851104736%2C0%20C3.3142902851104736%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%203.3142902851104736%2C15.470022201538086%20C3.3142902851104736%2C15.470022201538086%203.3142902851104736%2C9.149404525756836%203.3142902851104736%2C9.149404525756836%20C3.3142902851104736%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%2010.605714797973633%2C9.149404525756836%20C10.605714797973633%2C9.149404525756836%2010.605714797973633%2C15.470022201538086%2010.605714797973633%2C15.470022201538086%20C10.605714797973633%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%2013.919991493225098%2C15.470022201538086%20C13.919991493225098%2C15.470022201538086%2013.919991493225098%2C0%2013.919991493225098%2C0%20C13.919991493225098%2C0%2010.605714797973633%2C0%2010.605714797973633%2C0%20C10.605714797973633%2C0%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%20C10.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715%2010.605714797973633%2C6.165900230407715z'%2F%3E%3Cpath%20transform%3D'translate(69.23999786376953%2C0.27000001072883606)'%20d%3D'%20M3.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%207.403865814208984%2C2.983504056930542%207.403865814208984%2C2.983504056930542%20C9.03934097290039%2C2.983504056930542%209.901290893554688%2C3.5801939964294434%209.901290893554688%2C4.707304000854492%20C9.901290893554688%2C5.834399700164795%209.03934097290039%2C6.431103706359863%207.403865814208984%2C6.431103706359863%20C7.403865814208984%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%203.3151700496673584%2C6.431103706359863%20C3.3151700496673584%2C6.431103706359863%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%20C3.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542%203.3151700496673584%2C2.983504056930542z%20M13.216461181640625%2C4.707304000854492%20C13.216461181640625%2C1.7900969982147217%2011.072648048400879%2C0%207.558576583862305%2C0%20C7.558576583862305%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%203.3151700496673584%2C15.470022201538086%20C3.3151700496673584%2C15.470022201538086%203.3151700496673584%2C9.414593696594238%203.3151700496673584%2C9.414593696594238%20C3.3151700496673584%2C9.414593696594238%207.005825519561768%2C9.414593696594238%207.005825519561768%2C9.414593696594238%20C7.005825519561768%2C9.414593696594238%2010.321218490600586%2C15.470022201538086%2010.321218490600586%2C15.470022201538086%20C10.321218490600586%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%2013.990056991577148%2C15.470022201538086%20C13.990056991577148%2C15.470022201538086%2010.319005966186523%2C8.953378677368164%2010.319005966186523%2C8.953378677368164%20C12.161579132080078%2C8.245061874389648%2013.216461181640625%2C6.753532409667969%2013.216461181640625%2C4.707304000854492%20C13.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492%2013.216461181640625%2C4.707304000854492z'%2F%3E%3Cpath%20transform%3D'translate(84.98999786376953%2C0)'%20d%3D'%20M7.622087478637695%2C12.906073570251465%20C5.015110492706299%2C12.906073570251465%203.4244225025177%2C11.049725532531738%203.4244225025177%2C8.022093772888184%20C3.4244225025177%2C4.95027494430542%205.015110492706299%2C3.0939269065856934%207.622087478637695%2C3.0939269065856934%20C10.206976890563965%2C3.0939269065856934%2011.775577545166016%2C4.95027494430542%2011.775577545166016%2C8.022093772888184%20C11.775577545166016%2C11.049725532531738%2010.206976890563965%2C12.906073570251465%207.622087478637695%2C12.906073570251465%20C7.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465%207.622087478637695%2C12.906073570251465z%20M7.622087478637695%2C0%20C3.1593029499053955%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1593029499053955%2C16%207.622087478637695%2C16%20C12.062784194946289%2C16%2015.200028419494629%2C12.685078620910645%2015.200028419494629%2C8.022093772888184%20C15.200028419494629%2C3.3149218559265137%2012.062784194946289%2C0%207.622087478637695%2C0%20C7.622087478637695%2C0%207.622087478637695%2C0%207.622087478637695%2C0z'%2F%3E%3Cpath%20transform%3D'translate(103.29000091552734%2C0.27000001072883606)'%20d%3D'%20M7.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%203.3160574436187744%2C6.873104095458984%20C3.3160574436187744%2C6.873104095458984%203.3160574436187744%2C2.983504056930542%203.3160574436187744%2C2.983504056930542%20C3.3160574436187744%2C2.983504056930542%207.405848026275635%2C2.983504056930542%207.405848026275635%2C2.983504056930542%20C9.04176139831543%2C2.983504056930542%209.90394115447998%2C3.646505117416382%209.90394115447998%2C4.928304195404053%20C9.90394115447998%2C6.2101030349731445%209.04176139831543%2C6.873104095458984%207.405848026275635%2C6.873104095458984%20C7.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984%207.405848026275635%2C6.873104095458984z%20M7.5605998039245605%2C0%20C7.5605998039245605%2C0%200%2C0%200%2C0%20C0%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%203.3160574436187744%2C15.470022201538086%20C3.3160574436187744%2C15.470022201538086%203.3160574436187744%2C9.85659408569336%203.3160574436187744%2C9.85659408569336%20C3.3160574436187744%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%207.5605998039245605%2C9.85659408569336%20C11.07561206817627%2C9.85659408569336%2013.219999313354492%2C8.000200271606445%2013.219999313354492%2C4.928304195404053%20C13.219999313354492%2C1.8563942909240723%2011.07561206817627%2C0%207.5605998039245605%2C0%20C7.5605998039245605%2C0%207.5605998039245605%2C0%207.5605998039245605%2C0z'%2F%3E%3Cpath%20transform%3D'translate(128.0399932861328%2C0)'%20d%3D'%20M10.914844512939453%2C10.5414400100708%20C10.340370178222656%2C12.044201850891113%209.191434860229492%2C12.906073570251465%207.622706890106201%2C12.906073570251465%20C5.0155181884765625%2C12.906073570251465%203.4246866703033447%2C11.049725532531738%203.4246866703033447%2C8.022093772888184%20C3.4246866703033447%2C4.95027494430542%205.0155181884765625%2C3.0939269065856934%207.622706890106201%2C3.0939269065856934%20C9.191434860229492%2C3.0939269065856934%2010.340370178222656%2C3.9557981491088867%2010.914844512939453%2C5.458559989929199%20C10.914844512939453%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%2014.427860260009766%2C5.458559989929199%20C13.566211700439453%2C2.1436522006988525%2010.981111526489258%2C0%207.622706890106201%2C0%20C3.1595458984375%2C0%200%2C3.3149218559265137%200%2C8.022093772888184%20C0%2C12.685078620910645%203.1595458984375%2C16%207.622706890106201%2C16%20C11.003214836120605%2C16%2013.588300704956055%2C13.834254264831543%2014.449976921081543%2C10.5414400100708%20C14.449976921081543%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%20C10.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708%2010.914844512939453%2C10.5414400100708z'%2F%3E%3Cpath%20transform%3D'translate(117.83000183105469%2C0.27000001072883606)'%20d%3D'%20M0%2C0%20C0%2C0%206.1677093505859375%2C15.470022201538086%206.1677093505859375%2C15.470022201538086%20C6.1677093505859375%2C15.470022201538086%209.550004005432129%2C15.470022201538086%209.550004005432129%2C15.470022201538086%20C9.550004005432129%2C15.470022201538086%203.382294178009033%2C0%203.382294178009033%2C0%20C3.382294178009033%2C0%200%2C0%200%2C0%20C0%2C0%200%2C0%200%2C0z'%2F%3E%3Cpath%20transform%3D'translate(0%2C0.27000001072883606)'%20d%3D'%20M5.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%207.93500280380249%2C3.911694288253784%207.93500280380249%2C3.911694288253784%20C7.93500280380249%2C3.911694288253784%2010.045400619506836%2C9.348296165466309%2010.045400619506836%2C9.348296165466309%20C10.045400619506836%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%20C5.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309%205.824605464935303%2C9.348296165466309z%20M6.166755199432373%2C0%20C6.166755199432373%2C0%200%2C15.470022201538086%200%2C15.470022201538086%20C0%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%203.4480772018432617%2C15.470022201538086%20C3.4480772018432617%2C15.470022201538086%204.709278583526611%2C12.22130012512207%204.709278583526611%2C12.22130012512207%20C4.709278583526611%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%2011.16093635559082%2C12.22130012512207%20C11.16093635559082%2C12.22130012512207%2012.421928405761719%2C15.470022201538086%2012.421928405761719%2C15.470022201538086%20C12.421928405761719%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%2015.87000560760498%2C15.470022201538086%20C15.87000560760498%2C15.470022201538086%209.703250885009766%2C0%209.703250885009766%2C0%20C9.703250885009766%2C0%206.166755199432373%2C0%206.166755199432373%2C0%20C6.166755199432373%2C0%206.166755199432373%2C0%206.166755199432373%2C0z'%2F%3E%3C%2Fsvg%3E\") center / contain no-repeat;",
2646
+ "}",
2647
+ "",
2648
+ "body[data-dsh-claude-style] .dsh-claude-ban-bar-actions {",
2649
+ " display: flex;",
2650
+ " align-items: center;",
2651
+ " gap: 8px;",
2652
+ "}",
2653
+ "",
2654
+ "body[data-dsh-claude-style] .dsh-claude-ban-signout {",
2655
+ " appearance: none;",
2656
+ " margin: 0;",
2657
+ " border: 1px solid var(--dsh-ban-hairline);",
2658
+ " border-radius: 8px;",
2659
+ " background: var(--dsh-ban-card);",
2660
+ " color: var(--dsh-ban-text);",
2661
+ " padding: 6px 14px;",
2662
+ " font: inherit;",
2663
+ " font-size: 13px;",
2664
+ " line-height: 18px;",
2665
+ " cursor: pointer;",
2666
+ " box-shadow: 0 1px 2px rgba(20, 20, 19, 0.05);",
2667
+ " transition: background-color 0.12s ease;",
2668
+ "}",
2669
+ "",
2670
+ "body[data-dsh-claude-style] .dsh-claude-ban-signout:hover {",
2671
+ " background: var(--dsh-ban-hover);",
2672
+ "}",
2673
+ "",
2674
+ "body[data-dsh-claude-style] .dsh-claude-ban-window {",
2675
+ " display: flex;",
2676
+ " align-items: center;",
2677
+ "}",
2678
+ "",
2679
+ "body[data-dsh-claude-style] .dsh-claude-ban-win {",
2680
+ " appearance: none;",
2681
+ " margin: 0;",
2682
+ " border: 0;",
2683
+ " background: transparent;",
2684
+ " color: var(--dsh-ban-muted);",
2685
+ " width: 34px;",
2686
+ " height: 28px;",
2687
+ " padding: 6px;",
2688
+ " cursor: pointer;",
2689
+ " border-radius: 4px;",
2690
+ " transition: background-color 0.12s ease;",
2691
+ "}",
2692
+ "",
2693
+ "body[data-dsh-claude-style] .dsh-claude-ban-win:hover {",
2694
+ " background: var(--dsh-ban-hover);",
2695
+ " color: var(--dsh-ban-text);",
2696
+ "}",
2697
+ "",
2698
+ "/* ---------- account_banned toast ---------- */",
2699
+ "body[data-dsh-claude-style] .dsh-claude-ban-toast {",
2700
+ " position: absolute;",
2701
+ " top: 94px;",
2702
+ " right: 40px;",
2703
+ " display: flex;",
2704
+ " align-items: center;",
2705
+ " gap: 10px;",
2706
+ " max-width: 340px;",
2707
+ " padding: 10px 12px;",
2708
+ " border: 1px solid var(--dsh-ban-toast-border);",
2709
+ " border-radius: 12px;",
2710
+ " background: var(--dsh-ban-toast-bg);",
2711
+ " color: var(--dsh-ban-toast-text);",
2712
+ " font-size: 13px;",
2713
+ " line-height: 18px;",
2714
+ " cursor: pointer;",
2715
+ " box-shadow: 0 4px 16px rgba(20, 20, 19, 0.08);",
2716
+ " animation: dsh-claude-ban-toast-in 0.22s ease both;",
2717
+ "}",
2718
+ "",
2719
+ "@keyframes dsh-claude-ban-toast-in {",
2720
+ " from { opacity: 0; transform: translateY(-6px); }",
2721
+ " to { opacity: 1; transform: none; }",
2722
+ "}",
2723
+ "",
2724
+ "body[data-dsh-claude-style] .dsh-claude-ban-toast-icon {",
2725
+ " flex: none;",
2726
+ " width: 16px;",
2727
+ " height: 16px;",
2728
+ " color: var(--dsh-ban-toast-icon);",
2729
+ "}",
2730
+ "",
2731
+ "body[data-dsh-claude-style] .dsh-claude-ban-toast-text {",
2732
+ " flex: 1;",
2733
+ " min-width: 0;",
2734
+ " overflow: hidden;",
2735
+ " text-overflow: ellipsis;",
2736
+ " white-space: nowrap;",
2737
+ "}",
2738
+ "",
2739
+ "body[data-dsh-claude-style] .dsh-claude-ban-toast-close {",
2740
+ " flex: none;",
2741
+ " width: 14px;",
2742
+ " height: 14px;",
2743
+ " opacity: 0.7;",
2744
+ "}",
2745
+ "",
2746
+ "body[data-dsh-claude-style] .dsh-claude-ban-toast:hover {",
2747
+ " border-color: var(--dsh-ban-toast-icon);",
2748
+ "}",
2749
+ "",
2750
+ "/* ---------- content column ---------- */",
2751
+ "/* The page is one centred column: the card stack is the page's measure, so it",
2752
+ " is centred in the window rather than pinned to a left inset, and capped so it",
2753
+ " never stretches into a measure no one wants to read. */",
2754
+ "body[data-dsh-claude-style] .dsh-claude-ban-scroll {",
2755
+ " position: absolute;",
2756
+ " inset: 86px 0 0 0;",
2757
+ " overflow-y: auto;",
2758
+ " overflow-x: hidden;",
2759
+ "}",
2760
+ "",
2761
+ "body[data-dsh-claude-style] .dsh-claude-ban-column {",
2762
+ " width: 63%;",
2763
+ " max-width: 1150px;",
2764
+ " margin: 0 auto;",
2765
+ " padding: 70px 40px 96px;",
2766
+ "}",
2767
+ "",
2768
+ "/* The icon box is the lock's size lever: the traced ink is 20 of the SVG's 24",
2769
+ " units, so 75px here paints a ~61px lock — the reference page's lock, which",
2770
+ " reads about a third larger than the 58px box did next to the same title. */",
2771
+ "body[data-dsh-claude-style] .dsh-claude-ban-lock {",
2772
+ " display: block;",
2773
+ " width: 75px;",
2774
+ " height: 75px;",
2775
+ " color: var(--dsh-ban-text);",
2776
+ "}",
2777
+ "",
2778
+ "body[data-dsh-claude-style] .dsh-claude-ban-title {",
2779
+ " margin: 26px 0 0;",
2780
+ " font-family: var(--dsw-font-serif);",
2781
+ " font-size: 31px;",
2782
+ " font-weight: 500;",
2783
+ " line-height: 1.2;",
2784
+ " letter-spacing: -0.015em;",
2785
+ " color: var(--dsh-ban-text);",
2786
+ "}",
2787
+ "",
2788
+ "body[data-dsh-claude-style] .dsh-claude-ban-lead {",
2789
+ " margin: 22px 0 0;",
2790
+ " font-size: 15px;",
2791
+ " line-height: 1.6;",
2792
+ " color: var(--dsh-ban-text);",
2793
+ "}",
2794
+ "",
2795
+ "body[data-dsh-claude-style] .dsh-claude-ban-lead strong {",
2796
+ " font-weight: 700;",
2797
+ "}",
2798
+ "",
2799
+ "body[data-dsh-claude-style] .dsh-claude-ban-next {",
2800
+ " margin: 32px 0 0;",
2801
+ " font-size: 15px;",
2802
+ " line-height: 1.6;",
2803
+ " color: var(--dsh-ban-text);",
2804
+ "}",
2805
+ "",
2806
+ "body[data-dsh-claude-style] .dsh-claude-ban-subtitle {",
2807
+ " margin: 44px 0 0;",
2808
+ " font-family: var(--dsw-font-family);",
2809
+ " font-size: 17px;",
2810
+ " font-weight: 600;",
2811
+ " line-height: 1.4;",
2812
+ " letter-spacing: 0;",
2813
+ " color: var(--dsh-ban-text);",
2814
+ "}",
2815
+ "",
2816
+ "/* ---------- cards: the numbered steps and the two account actions ---------- */",
2817
+ "body[data-dsh-claude-style] .dsh-claude-ban-card {",
2818
+ " margin-top: 18px;",
2819
+ " border: 1px solid var(--dsh-ban-hairline);",
2820
+ " border-radius: 12px;",
2821
+ " background: var(--dsh-ban-card);",
2822
+ " overflow: hidden;",
2823
+ "}",
2824
+ "",
2825
+ "body[data-dsh-claude-style] .dsh-claude-ban-step {",
2826
+ " display: flex;",
2827
+ " align-items: flex-start;",
2828
+ " gap: 14px;",
2829
+ " padding: 16px 24px;",
2830
+ "}",
2831
+ "",
2832
+ "body[data-dsh-claude-style] .dsh-claude-ban-step-num {",
2833
+ " flex: none;",
2834
+ " width: 24px;",
2835
+ " height: 24px;",
2836
+ " margin-top: 1px;",
2837
+ " border-radius: 50%;",
2838
+ " background: var(--dsh-ban-hover);",
2839
+ " color: var(--dsh-ban-text);",
2840
+ " font-size: 12px;",
2841
+ " line-height: 24px;",
2842
+ " text-align: center;",
2843
+ "}",
2844
+ "",
2845
+ "body[data-dsh-claude-style] .dsh-claude-ban-step-body {",
2846
+ " display: block;",
2847
+ " min-width: 0;",
2848
+ "}",
2849
+ "",
2850
+ "body[data-dsh-claude-style] .dsh-claude-ban-step-title {",
2851
+ " display: block;",
2852
+ " font-size: 15px;",
2853
+ " font-weight: 500;",
2854
+ " line-height: 1.5;",
2855
+ " color: var(--dsh-ban-text);",
2856
+ "}",
2857
+ "",
2858
+ "body[data-dsh-claude-style] .dsh-claude-ban-step-desc {",
2859
+ " display: block;",
2860
+ " margin-top: 2px;",
2861
+ " font-size: 13.5px;",
2862
+ " line-height: 1.5;",
2863
+ " color: var(--dsh-ban-muted);",
2864
+ "}",
2865
+ "",
2866
+ "body[data-dsh-claude-style] .dsh-claude-ban-primary {",
2867
+ " appearance: none;",
2868
+ " display: inline-block;",
2869
+ " margin: 26px 0 0;",
2870
+ " border: 0;",
2871
+ " border-radius: 8px;",
2872
+ " background: var(--dsh-ban-primary-fill);",
2873
+ " color: var(--dsh-ban-primary-text);",
2874
+ " padding: 9px 18px;",
2875
+ " font: inherit;",
2876
+ " font-size: 14px;",
2877
+ " font-weight: 500;",
2878
+ " line-height: 20px;",
2879
+ " cursor: pointer;",
2880
+ " transition: background-color 0.12s ease;",
2881
+ "}",
2882
+ "",
2883
+ "body[data-dsh-claude-style] .dsh-claude-ban-primary:hover {",
2884
+ " background: var(--dsh-ban-primary-hover);",
2885
+ "}",
2886
+ "",
2887
+ "body[data-dsh-claude-style] .dsh-claude-ban-actions {",
2888
+ " margin-top: 18px;",
2889
+ "}",
2890
+ "",
2891
+ "body[data-dsh-claude-style] .dsh-claude-ban-action {",
2892
+ " appearance: none;",
2893
+ " display: flex;",
2894
+ " align-items: flex-start;",
2895
+ " gap: 16px;",
2896
+ " width: 100%;",
2897
+ " margin: 0;",
2898
+ " border: 0;",
2899
+ " background: transparent;",
2900
+ " color: inherit;",
2901
+ " padding: 18px 24px;",
2902
+ " font: inherit;",
2903
+ " text-align: left;",
2904
+ " cursor: pointer;",
2905
+ " transition: background-color 0.12s ease;",
2906
+ "}",
2907
+ "",
2908
+ "body[data-dsh-claude-style] .dsh-claude-ban-action + .dsh-claude-ban-action {",
2909
+ " border-top: 1px solid var(--dsh-ban-hairline);",
2910
+ "}",
2911
+ "",
2912
+ "body[data-dsh-claude-style] .dsh-claude-ban-action:hover {",
2913
+ " background: var(--dsh-ban-hover);",
2914
+ "}",
2915
+ "",
2916
+ "body[data-dsh-claude-style] .dsh-claude-ban-action-icon {",
2917
+ " flex: none;",
2918
+ " width: 18px;",
2919
+ " height: 18px;",
2920
+ " margin-top: 2px;",
2921
+ " color: var(--dsh-ban-muted);",
2922
+ "}",
2923
+ "",
2924
+ "body[data-dsh-claude-style] .dsh-claude-ban-action-text {",
2925
+ " display: block;",
2926
+ " flex: 1;",
2927
+ " min-width: 0;",
2928
+ "}",
2929
+ "",
2930
+ "body[data-dsh-claude-style] .dsh-claude-ban-action-title {",
2931
+ " display: block;",
2932
+ " font-size: 15px;",
2933
+ " font-weight: 500;",
2934
+ " line-height: 1.5;",
2935
+ " color: var(--dsh-ban-text);",
2936
+ "}",
2937
+ "",
2938
+ "body[data-dsh-claude-style] .dsh-claude-ban-action-title-danger {",
2939
+ " color: var(--dsh-ban-danger);",
2940
+ "}",
2941
+ "",
2942
+ "body[data-dsh-claude-style] .dsh-claude-ban-action:hover .dsh-claude-ban-action-title-danger {",
2943
+ " color: var(--dsh-ban-danger-hover);",
2944
+ "}",
2945
+ "",
2946
+ "body[data-dsh-claude-style] .dsh-claude-ban-action-desc {",
2947
+ " display: block;",
2948
+ " margin-top: 3px;",
2949
+ " font-size: 13.5px;",
2950
+ " line-height: 1.5;",
2951
+ " color: var(--dsh-ban-muted);",
2952
+ "}",
2953
+ "",
2954
+ "body[data-dsh-claude-style] .dsh-claude-ban-action-chevron {",
2955
+ " flex: none;",
2956
+ " width: 18px;",
2957
+ " height: 18px;",
2958
+ " margin-top: 3px;",
2959
+ " color: var(--dsh-ban-muted);",
2960
+ "}",
2961
+ "",
2962
+ "/* Narrow windows: drop the fixed left inset so the column keeps its measure",
2963
+ " instead of being squeezed against the right edge. */",
2964
+ "@media (max-width: 1000px) {",
2965
+ " body[data-dsh-claude-style] .dsh-claude-ban-column {",
2966
+ " width: auto;",
2967
+ " padding: 72px 32px 80px;",
2968
+ " }",
2969
+ "",
2970
+ " body[data-dsh-claude-style] .dsh-claude-ban-toast {",
2971
+ " right: 24px;",
2972
+ " max-width: calc(100% - 48px);",
2973
+ " }",
2974
+ "}",
2975
+ "",
2442
2976
  "/* ---------- Claude Code layout: model picker ---------- */",
2443
2977
  "/* Replaces the host's two-pane model menu: level 1 carries the current",
2444
2978
  " provider's models, a divider, the effort row and a More models row; both",
@@ -2665,9 +3199,11 @@ window.__ModuleLoader__.load({
2665
3199
  " color: var(--dsw-alias-label-caption, #a6a094) !important;",
2666
3200
  "}",
2667
3201
  "",
2668
- "/* Popover Header */",
3202
+ "/* Popover Header. Vertical padding only: the clickable account row carries its",
3203
+ " own inline padding (components/account-footer.css), and the divider below is a",
3204
+ " full-bleed rule that must not be inset by this box. */",
2669
3205
  "body[data-dsh-claude-style] .dsh-claude-account-popover-header {",
2670
- " padding: 6px 8px 6px 8px !important;",
3206
+ " padding: 6px 0 !important;",
2671
3207
  " display: flex !important;",
2672
3208
  " flex-direction: column !important;",
2673
3209
  " gap: 2px !important;",
@@ -2682,7 +3218,7 @@ window.__ModuleLoader__.load({
2682
3218
  "body[data-dsh-claude-style] .dsh-claude-account-popover-divider {",
2683
3219
  " height: 1px !important;",
2684
3220
  " background: var(--dsw-alias-border-l1, #e8e6dc) !important;",
2685
- " margin: 2px 0 4px 0 !important;",
3221
+ " margin: 2px 0 !important;",
2686
3222
  " flex: none !important;",
2687
3223
  "}",
2688
3224
  "",
@@ -4415,6 +4951,7 @@ window.__ModuleLoader__.load({
4415
4951
  autoPopover: true,
4416
4952
  composerScope: 'all',
4417
4953
  username: '',
4954
+ banLocale: DEFAULT_BAN_LOCALE,
4418
4955
  }
4419
4956
  var prefsRevision
4420
4957
  var prefsAvailable = false
@@ -4517,6 +5054,9 @@ window.__ModuleLoader__.load({
4517
5054
  autoPopover: section.autoPopover !== false,
4518
5055
  composerScope: COMPOSER_SCOPES.indexOf(section.composerScope) === -1 ? 'all' : section.composerScope,
4519
5056
  username: (typeof section.username === 'string' ? section.username.trim().slice(0, USERNAME_MAX) : '') || fallbackUsername,
5057
+ // `banLocale` is read by the browser half only; a host half that predates
5058
+ // the field simply reports nothing, so an unknown value falls back here.
5059
+ banLocale: BAN_LOCALES.indexOf(section.banLocale) === -1 ? DEFAULT_BAN_LOCALE : section.banLocale,
4520
5060
  }
4521
5061
  }
4522
5062
 
@@ -4639,6 +5179,11 @@ window.__ModuleLoader__.load({
4639
5179
  var index = {
4640
5180
  ui: doc.ui && typeof doc.ui === 'object' ? doc.ui : {},
4641
5181
  settings: doc.settings && typeof doc.settings === 'object' ? doc.settings : {},
5182
+ // The account-hold easter egg's page copy rides the same document
5183
+ // (src/overrides/ban-screen.js). Every block the document carries has to
5184
+ // be listed here: this index IS what lookups read, so an unlisted block
5185
+ // would silently fall back to the bundle's English constants.
5186
+ ban: doc.ban && typeof doc.ban === 'object' ? doc.ban : {},
4642
5187
  exact: exact,
4643
5188
  aliases: doc.aliases && typeof doc.aliases === 'object' ? doc.aliases : {},
4644
5189
  fallback: typeof doc.fallback === 'string' && doc.fallback ? doc.fallback : MODEL_COPY_FALLBACK_LOCALE,
@@ -4741,6 +5286,26 @@ window.__ModuleLoader__.load({
4741
5286
  return text || fallback
4742
5287
  }
4743
5288
 
5289
+ /**
5290
+ * One account-hold easter-egg string, in the language the `banLocale`
5291
+ * preference names — NOT the shell's language. The page reproduces a real
5292
+ * Claude screen, so it is read in the language Claude wrote it in whatever
5293
+ * the rest of the UI is set to; `localized` is bypassed on purpose rather
5294
+ * than fed a fake locale, so a missing translation still falls through the
5295
+ * document's own fallback locale.
5296
+ */
5297
+ function banCopy(key, fallback, params) {
5298
+ var pair = modelCopy === null || !modelCopy.ban ? null : modelCopy.ban[key]
5299
+ var want = readPrefs().banLocale
5300
+ var text = pair && typeof pair === 'object' && typeof pair[want] === 'string' ? pair[want] : ''
5301
+ if (!text) text = localized(pair)
5302
+ if (!text) text = fallback
5303
+ if (!params) return text
5304
+ return text.replace(/\{(\w+)\}/g, function (match, name) {
5305
+ return Object.prototype.hasOwnProperty.call(params, name) ? String(params[name]) : match
5306
+ })
5307
+ }
5308
+
4744
5309
  // ============================================================================
4745
5310
  // 弹层共享辅助 (Shared Popover Helpers)
4746
5311
  // ============================================================================
@@ -6445,6 +7010,12 @@ window.__ModuleLoader__.load({
6445
7010
  var accountPopover = null
6446
7011
  var popoverBody = null
6447
7012
  var popoverHoverIntent = createHoverIntent(openPopover, closePopover, 150)
7013
+ // Whether the popover is up because it was CLICKED (rather than hovered).
7014
+ // Clicking the account row opens the ban-screen easter egg and leaves the
7015
+ // pointer inside the popover, so without this the row's own mouseleave
7016
+ // would tear the popover down behind the overlay; a click-opened popover
7017
+ // instead stays until the pointer leaves the whole footer.
7018
+ var popoverOpenedByClick = false
6448
7019
 
6449
7020
  function openPopover() {
6450
7021
  if (!accountPopover || !accountBtn) return
@@ -6467,6 +7038,7 @@ window.__ModuleLoader__.load({
6467
7038
  function closePopover() {
6468
7039
  if (!accountPopover || !accountBtn) return
6469
7040
  cancelClosePopover()
7041
+ popoverOpenedByClick = false
6470
7042
  accountPopover.setAttribute('data-open', 'false')
6471
7043
  accountBtn.setAttribute('data-open', 'false')
6472
7044
  accountBtn.setAttribute('aria-expanded', 'false')
@@ -6478,6 +7050,10 @@ window.__ModuleLoader__.load({
6478
7050
  if (isOpen) {
6479
7051
  closePopover()
6480
7052
  } else {
7053
+ // The pointer stays on the trigger after a click, and the popover
7054
+ // hangs below it, so the trigger's mouseleave must not close what the
7055
+ // click just opened — otherwise the panel is unreachable with a mouse.
7056
+ popoverOpenedByClick = true
6481
7057
  openPopover()
6482
7058
  }
6483
7059
  }
@@ -7041,7 +7617,7 @@ window.__ModuleLoader__.load({
7041
7617
  if (readPrefs().autoPopover) openPopover()
7042
7618
  })
7043
7619
  accountBtn.addEventListener('mouseleave', function () {
7044
- if (readPrefs().autoPopover) scheduleClosePopover()
7620
+ if (readPrefs().autoPopover && !popoverOpenedByClick) scheduleClosePopover()
7045
7621
  })
7046
7622
  accountBtn.addEventListener('click', function (e) {
7047
7623
  e.stopPropagation()
@@ -7067,8 +7643,21 @@ window.__ModuleLoader__.load({
7067
7643
  scheduleClosePopover()
7068
7644
  })
7069
7645
 
7646
+ // The account row is the ban-screen easter egg's trigger
7647
+ // (src/overrides/ban-screen.js). The marker attribute stays on the
7648
+ // header (it is the row's stable hook, and the row keeps its
7649
+ // semantics), but the header is only a WRAPPER: the clickable strip is
7650
+ // the inner `.…-row`, and the divider is its SIBLING so the hover
7651
+ // plate covers the name alone instead of swallowing the rule.
7070
7652
  var header = document.createElement('div')
7071
7653
  header.className = 'dsh-claude-account-popover-header'
7654
+ header.setAttribute('data-dsh-claude-ban-row', '')
7655
+
7656
+ var rowEl = document.createElement('div')
7657
+ rowEl.className = 'dsh-claude-account-popover-row'
7658
+ rowEl.setAttribute('role', 'button')
7659
+ rowEl.setAttribute('tabindex', '0')
7660
+ rowEl.setAttribute('aria-haspopup', 'dialog')
7072
7661
 
7073
7662
  var nameEl = document.createElement('div')
7074
7663
  nameEl.className = 'dsh-claude-account-popover-name'
@@ -7077,7 +7666,8 @@ window.__ModuleLoader__.load({
7077
7666
  var divider = document.createElement('div')
7078
7667
  divider.className = 'dsh-claude-account-popover-divider'
7079
7668
 
7080
- header.appendChild(nameEl)
7669
+ rowEl.appendChild(nameEl)
7670
+ header.appendChild(rowEl)
7081
7671
  header.appendChild(divider)
7082
7672
  accountPopover.appendChild(header)
7083
7673
 
@@ -7091,6 +7681,37 @@ window.__ModuleLoader__.load({
7091
7681
  if (nameEl2 && nameEl2.textContent !== username) nameEl2.textContent = username
7092
7682
  }
7093
7683
 
7684
+ // The account row is the ban-screen easter egg's trigger (ban-screen.js).
7685
+ // Bound OUTSIDE the build/refresh branch above so the pass that creates
7686
+ // the popover already wires the row — inside the `else` the very first
7687
+ // render would leave it dead until the next sync. `__dshBanBound` keeps
7688
+ // a later pass from binding it twice, which would open the overlay twice
7689
+ // per click.
7690
+ var banRow = accountPopover.querySelector('[data-dsh-claude-ban-row]')
7691
+ if (banRow && !banRow.__dshBanBound) {
7692
+ banRow.__dshBanBound = true
7693
+ banRow.addEventListener('click', function (e) {
7694
+ // The row's gesture is the easter egg, not a popover selection.
7695
+ e.preventDefault()
7696
+ e.stopPropagation()
7697
+ // Leave the popover up: the overlay is a full-window surface, so
7698
+ // what is behind it does not matter, and the footer is left as the
7699
+ // user had it once the screen is dismissed. The pointer is still
7700
+ // parked on the trigger, so the mouseleave close stays suspended
7701
+ // (popoverOpenedByClick) and the panel does not blink out from under
7702
+ // the overlay.
7703
+ popoverOpenedByClick = true
7704
+ if (ui.ban) ui.ban.open()
7705
+ })
7706
+ banRow.addEventListener('keydown', function (e) {
7707
+ if (e.key !== 'Enter' && e.key !== ' ') return
7708
+ e.preventDefault()
7709
+ e.stopPropagation()
7710
+ popoverOpenedByClick = true
7711
+ if (ui.ban) ui.ban.open()
7712
+ })
7713
+ }
7714
+
7094
7715
  syncPopoverItems(footArea)
7095
7716
  }
7096
7717
 
@@ -7125,6 +7746,332 @@ window.__ModuleLoader__.load({
7125
7746
  }
7126
7747
  }
7127
7748
 
7749
+ // ============================================================================
7750
+ // 4.5: 账户封禁彩蛋 (Account-ban Easter Egg)
7751
+ // ============================================================================
7752
+ /**
7753
+ * The "Your account is on hold" screen, reproduced from Claude's own
7754
+ * account-hold page. It is an EASTER EGG, not a real state: nothing here
7755
+ * touches the host, the session, or the preference store — the overlay is
7756
+ * one node appended to `<body>` and removed again on the way out.
7757
+ *
7758
+ * Entry is the account row at the top of the sidebar footer's account
7759
+ * popover (src/overrides/account-footer.js binds that row to
7760
+ * `ui.ban.open()`). Exit follows the way in — every control the page
7761
+ * paints ("Sign out", "Request a review", the two "What you can do" rows,
7762
+ * the toast's dismiss button, the window controls) closes it, and Esc
7763
+ * closes it (scheduler.js's global key handler). Nothing inside the overlay
7764
+ * performs the action its label names.
7765
+ *
7766
+ * Losing focus does NOT close it, on purpose. The page is something to
7767
+ * READ: the reader has to switch windows to look something up, and an
7768
+ * overlay that vanishes the moment they do is worse than one that waits.
7769
+ * Leaving is always an explicit act — a control on the page or Esc — so the
7770
+ * blur listener this used to carry is gone.
7771
+ *
7772
+ * Layout note: the overlay is `position: fixed` at the top of the stacking
7773
+ * order rather than a real page, so it covers the whole window (sidebar,
7774
+ * titlebar, composer) whatever the host renders underneath — and it can
7775
+ * never be clipped by the sidebar column, which the account popover itself
7776
+ * has to work around.
7777
+ */
7778
+ function installBanScreen(ctx, ui) {
7779
+ var banRoot = null
7780
+
7781
+ /**
7782
+ * Close the easter egg. Safe to call at any time (teardown, a second
7783
+ * click, a missing overlay): everything is null-checked and the handle
7784
+ * is idempotent, so the caller never has to know the current state.
7785
+ */
7786
+ function closeBanScreen() {
7787
+ if (banRoot !== null && banRoot.parentElement !== null) {
7788
+ banRoot.parentElement.removeChild(banRoot)
7789
+ }
7790
+ banRoot = null
7791
+ }
7792
+
7793
+ /** Whether `node` is one of the overlay's own dismiss controls. */
7794
+ function isBanDismissTarget(node) {
7795
+ var el = node
7796
+ while (el && el !== banRoot) {
7797
+ if (el.nodeType === 1 && el.hasAttribute('data-dsh-ban-dismiss')) return true
7798
+ el = el.parentElement
7799
+ }
7800
+ return false
7801
+ }
7802
+
7803
+ /**
7804
+ * One inline SVG. The page's own icons: none of them ship as assets.
7805
+ *
7806
+ * `strokeWidth` is a PARAMETER, not an extra attribute: appending a second
7807
+ * `stroke-width` to the same `<svg>` produces a duplicate attribute, and
7808
+ * the HTML parser drops every attribute after the first — the override
7809
+ * silently does nothing and the icon keeps the set's own 1.6 (which is how
7810
+ * the lock shipped at nearly 4px instead of the traced weight).
7811
+ */
7812
+ function banSvg(body, strokeWidth) {
7813
+ return '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="' +
7814
+ (strokeWidth === undefined ? 1.6 : strokeWidth) + '" ' +
7815
+ 'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + body + '</svg>'
7816
+ }
7817
+
7818
+ /**
7819
+ * The lock is a HAND-DRAWN TRACE, not a `rect` + `circle` assembly: every
7820
+ * edge is a cubic whose anchors and handles carry the sketch's own wobble.
7821
+ * Nothing here is a filter or a jitter — the hand-drawn character lives in
7822
+ * the anchor points themselves, so it survives any scale, and the geometry
7823
+ * stays reviewable: each `C` below is one anchor with its two handles.
7824
+ *
7825
+ * What the anchors encode, read off the reference sketch: the body's top
7826
+ * edge slants down to the right while the bottom edge sags; the left side
7827
+ * drifts outward on the way down and the right side bows out around the
7828
+ * keyhole before coming back; a short diagonal cuts each corner so no two
7829
+ * strokes meet at a perfect right angle; the shackle's two arches are not
7830
+ * concentric and its legs stop on the body's top edge instead of crossing
7831
+ * it; the keyhole's head is flatter than a circle, its waist sits
7832
+ * off-centre, and its base flares wider than the head.
7833
+ *
7834
+ * The numbers are the reference's ink centrelines (measured off an 89x92
7835
+ * px drawing) mapped onto this icon set's 24-unit grid: the ink box
7836
+ * (58.5x76.3 px) becomes 15.3x20 units, centred. `stroke-width` is 0.5
7837
+ * units — the ban screen paints this in a 75px box, so the ink lands at
7838
+ * ~61px and the line at ~1.6px, which is the weight the reference itself
7839
+ * is drawn at (a 2px line on a 77px lock).
7840
+ */
7841
+ /** The overlay's icon set, in one place so the markup below stays readable. */
7842
+ var BAN_ICONS = {
7843
+ lock: banSvg(
7844
+ // body: top edge, right side (with its outward bow), bottom edge, left side
7845
+ '<path d="M4.412 9.025 C9.287 8.894 14.136 9.077 19.379 9.182' +
7846
+ ' C19.379 11.541 19.379 13.638 19.405 14.949' +
7847
+ ' C19.667 15.735 19.641 16.784 19.457 17.57' +
7848
+ ' C19.379 18.619 19.379 20.191 19.379 21.659' +
7849
+ ' C14.923 21.764 9.156 21.764 4.674 21.659' +
7850
+ ' C4.7 19.405 4.7 16.26 4.674 14.163' +
7851
+ ' C4.621 13.114 4.516 12.066 4.438 11.279' +
7852
+ ' C4.385 10.231 4.385 9.444 4.412 9.025 Z"></path>' +
7853
+ // shackle: outer arch, then the inner one, both ending on the top edge
7854
+ '<path d="M8.081 8.972 C7.95 7.872 7.95 6.561 8.081 5.25' +
7855
+ ' C8.212 3.94 8.789 2.734 9.837 2.341' +
7856
+ ' C10.676 2.105 12.721 2.131 13.507 2.315' +
7857
+ ' C14.503 2.603 15.29 3.258 15.394 4.071' +
7858
+ ' C15.499 5.25 15.499 6.561 15.526 9.156' +
7859
+ ' M9.89 9.025 C9.785 7.609 9.785 6.299 9.89 5.25' +
7860
+ ' C9.995 4.359 10.519 3.861 11.567 3.861' +
7861
+ ' C12.537 3.809 13.324 4.097 13.664 4.988' +
7862
+ ' C13.796 5.644 13.796 7.085 13.796 9.13"></path>' +
7863
+ // keyhole: head, right wall into the waist, base, left wall back up
7864
+ '<path d="M10.021 14.634 C9.864 14.32 9.811 14.11 9.811 13.9' +
7865
+ ' C9.759 13.245 9.916 12.485 10.729 12.092' +
7866
+ ' C11.253 11.882 12.197 11.882 12.695 12.092' +
7867
+ ' C13.271 12.301 13.691 12.983 13.664 13.9' +
7868
+ ' C13.664 14.11 13.612 14.32 13.35 14.634' +
7869
+ ' C13.166 14.844 12.773 15.001 12.695 15.316' +
7870
+ ' C12.668 15.84 13.455 17.046 13.927 18.383' +
7871
+ ' C12.433 18.592 10.86 18.566 9.68 18.435' +
7872
+ ' C10.152 17.151 10.702 16.417 10.598 15.683' +
7873
+ ' C10.519 15.263 10.257 14.949 10.021 14.634 Z"></path>',
7874
+ 0.5
7875
+ ),
7876
+ warning: banSvg(
7877
+ '<path d="M10.3 3.9 2.6 17.2a2 2 0 0 0 1.7 3h15.4a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"></path>' +
7878
+ '<path d="M12 9v4.2"></path>' +
7879
+ '<path d="M12 16.8h.01"></path>'
7880
+ ),
7881
+ close: banSvg('<path d="M6.4 6.4 17.6 17.6"></path><path d="M17.6 6.4 6.4 17.6"></path>'),
7882
+ download: banSvg('<path d="M12 3.5v11"></path><path d="m7.5 10 4.5 4.5 4.5-4.5"></path><path d="M4.5 19.5h15"></path>'),
7883
+ trash: banSvg(
7884
+ '<path d="M4.5 6.8h15"></path>' +
7885
+ '<path d="M9.5 6.8V5.2a1.2 1.2 0 0 1 1.2-1.2h2.6a1.2 1.2 0 0 1 1.2 1.2v1.6"></path>' +
7886
+ '<path d="M6.8 6.8 7.7 19a1.5 1.5 0 0 0 1.5 1.4h5.6a1.5 1.5 0 0 0 1.5-1.4l.9-12.2"></path>' +
7887
+ '<path d="M10.3 10.4v6.2"></path><path d="M13.7 10.4v6.2"></path>'
7888
+ ),
7889
+ chevron: banSvg('<path d="m9.5 5.5 7 6.5-7 6.5"></path>'),
7890
+ minimize: banSvg('<path d="M4 12h16"></path>'),
7891
+ maximize: banSvg('<rect x="4.5" y="4.5" width="15" height="15" rx="2"></rect>'),
7892
+ restore: banSvg(
7893
+ '<rect x="4.5" y="8.5" width="11" height="11" rx="2"></rect>' +
7894
+ '<path d="M8.5 8.5V6a1.5 1.5 0 0 1 1.5-1.5h8A1.5 1.5 0 0 1 19.5 6v8a1.5 1.5 0 0 1-1.5 1.5h-2.5"></path>'
7895
+ ),
7896
+ }
7897
+
7898
+ /**
7899
+ * The hold timestamp. The date part is Claude's own format ("Jul 4, 2026")
7900
+ * and is built by hand rather than through `toLocaleString`, because the
7901
+ * page is a fixed bilingual document and the stamp must not re-translate
7902
+ * itself into a third format when the browser's locale is neither of the
7903
+ * two. The time part follows the chosen language's own convention — the
7904
+ * AM/PM clock in English, the 24-hour clock in Chinese.
7905
+ */
7906
+ var BAN_MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
7907
+ function formatBanStamp(date) {
7908
+ var datePart = BAN_MONTHS[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear()
7909
+ var timePart
7910
+ if (readPrefs().banLocale === BAN_LOCALE_ZH) {
7911
+ var hh = date.getHours()
7912
+ var mm = date.getMinutes()
7913
+ timePart = (hh < 10 ? '0' + hh : String(hh)) + ':' + (mm < 10 ? '0' + mm : String(mm))
7914
+ } else {
7915
+ var hours = date.getHours()
7916
+ var hour12 = hours % 12
7917
+ if (hour12 === 0) hour12 = 12
7918
+ var minutes = date.getMinutes()
7919
+ timePart = hour12 + ':' + (minutes < 10 ? '0' + minutes : String(minutes)) + ' ' + (hours < 12 ? 'AM' : 'PM')
7920
+ }
7921
+ return datePart + ', ' + timePart
7922
+ }
7923
+
7924
+ /** When the open overlay is dated, so a refresh never re-dates the page. */
7925
+ var banOpenedAt = null
7926
+
7927
+ /**
7928
+ * Show the screen.
7929
+ *
7930
+ * @param bannedAt - when the "hold" is dated; defaults to now. Exposed so
7931
+ * a caller (or a probe) can pin the timestamp instead of reading it off
7932
+ * the clock.
7933
+ */
7934
+ function openBanScreen(bannedAt) {
7935
+ closeBanScreen()
7936
+ if (typeof document === 'undefined' || document.body === null) return
7937
+
7938
+ var root = document.createElement('div')
7939
+ root.className = 'dsh-claude-ban'
7940
+ root.setAttribute('role', 'dialog')
7941
+ root.setAttribute('aria-modal', 'true')
7942
+ root.setAttribute('data-dsh-ban', '')
7943
+
7944
+ banOpenedAt = bannedAt instanceof Date ? bannedAt : new Date()
7945
+ var stamp = formatBanStamp(banOpenedAt)
7946
+ var username = getUsername(ctx)
7947
+
7948
+ // The wordmark follows the brand preference like the sidebar does; the
7949
+ // "off" choice only drops the starburst, since a bare "Claude" text
7950
+ // wordmark is what the page is.
7951
+ var brand = readPrefs().brand
7952
+ var showMark = brand !== BRAND_OFF
7953
+ var useAnthropic = brand === BRAND_ANTHROPIC
7954
+
7955
+ root.innerHTML =
7956
+ '<div class="dsh-claude-ban-bar">' +
7957
+ '<div class="dsh-claude-ban-brand">' +
7958
+ (showMark ? '<span class="dsh-claude-ban-mark"></span>' : '') +
7959
+ '<span class="dsh-claude-ban-word"></span>' +
7960
+ '</div>' +
7961
+ '<div class="dsh-claude-ban-bar-actions">' +
7962
+ '<button type="button" class="dsh-claude-ban-signout" data-dsh-ban-dismiss>' +
7963
+ banCopy('signOut', 'Sign out') +
7964
+ '</button>' +
7965
+ '<div class="dsh-claude-ban-window" aria-hidden="true">' +
7966
+ '<button type="button" class="dsh-claude-ban-win" tabindex="-1" data-dsh-ban-dismiss>' + BAN_ICONS.minimize + '</button>' +
7967
+ '<button type="button" class="dsh-claude-ban-win" tabindex="-1" data-dsh-ban-dismiss>' + BAN_ICONS.restore + '</button>' +
7968
+ '<button type="button" class="dsh-claude-ban-win" tabindex="-1" data-dsh-ban-dismiss>' + BAN_ICONS.close + '</button>' +
7969
+ '</div>' +
7970
+ '</div>' +
7971
+ '</div>' +
7972
+ '<div class="dsh-claude-ban-toast" data-dsh-ban-dismiss role="status">' +
7973
+ '<span class="dsh-claude-ban-toast-icon">' + BAN_ICONS.warning + '</span>' +
7974
+ '<span class="dsh-claude-ban-toast-text">' + username + ': account_banned</span>' +
7975
+ '<span class="dsh-claude-ban-toast-close">' + BAN_ICONS.close + '</span>' +
7976
+ '</div>' +
7977
+ '<div class="dsh-claude-ban-scroll">' +
7978
+ '<div class="dsh-claude-ban-column">' +
7979
+ '<span class="dsh-claude-ban-lock">' + BAN_ICONS.lock + '</span>' +
7980
+ '<h1 class="dsh-claude-ban-title">' + banCopy('title', 'Your account is on hold') + '</h1>' +
7981
+ '<p class="dsh-claude-ban-lead">' +
7982
+ banCopy('lead', 'We put your account on hold on <strong>{time}</strong> because of unusual activity. Your chats and data are safe.', { time: stamp }) +
7983
+ '</p>' +
7984
+ '<p class="dsh-claude-ban-lead">' + banCopy('leadError', 'If you think this hold is an error, you can request an account review.') + '</p>' +
7985
+ '<p class="dsh-claude-ban-next">' + banCopy('nextLabel', 'What happens next:') + '</p>' +
7986
+ '<div class="dsh-claude-ban-card">' +
7987
+ '<div class="dsh-claude-ban-step">' +
7988
+ '<span class="dsh-claude-ban-step-num">1</span>' +
7989
+ '<span class="dsh-claude-ban-step-body">' +
7990
+ '<span class="dsh-claude-ban-step-title">' + banCopy('step1Title', 'Request a review') + '</span>' +
7991
+ '<span class="dsh-claude-ban-step-desc">' + banCopy('step1Desc', 'Tell us more about what happened.') + '</span>' +
7992
+ '</span>' +
7993
+ '</div>' +
7994
+ '<div class="dsh-claude-ban-step">' +
7995
+ '<span class="dsh-claude-ban-step-num">2</span>' +
7996
+ '<span class="dsh-claude-ban-step-body">' +
7997
+ '<span class="dsh-claude-ban-step-title">' + banCopy('step2Title', 'We\u2019ll review your account') + '</span>' +
7998
+ '<span class="dsh-claude-ban-step-desc">' + banCopy('step2Desc', 'A team member will review your request and account activity together.') + '</span>' +
7999
+ '</span>' +
8000
+ '</div>' +
8001
+ '<div class="dsh-claude-ban-step">' +
8002
+ '<span class="dsh-claude-ban-step-num">3</span>' +
8003
+ '<span class="dsh-claude-ban-step-body">' +
8004
+ '<span class="dsh-claude-ban-step-title">' + banCopy('step3Title', 'We\u2019ll email you the outcome') + '</span>' +
8005
+ '<span class="dsh-claude-ban-step-desc">' + banCopy('step3Desc', 'Reviews take about 10 days.') + '</span>' +
8006
+ '</span>' +
8007
+ '</div>' +
8008
+ '</div>' +
8009
+ '<button type="button" class="dsh-claude-ban-primary" data-dsh-ban-dismiss>' +
8010
+ banCopy('review', 'Request a review') +
8011
+ '</button>' +
8012
+ '<h2 class="dsh-claude-ban-subtitle">' + banCopy('whatYouCanDo', 'What you can do') + '</h2>' +
8013
+ '<div class="dsh-claude-ban-card dsh-claude-ban-actions">' +
8014
+ '<button type="button" class="dsh-claude-ban-action" data-dsh-ban-dismiss>' +
8015
+ '<span class="dsh-claude-ban-action-icon">' + BAN_ICONS.download + '</span>' +
8016
+ '<span class="dsh-claude-ban-action-text">' +
8017
+ '<span class="dsh-claude-ban-action-title">' + banCopy('exportTitle', 'Export your data') + '</span>' +
8018
+ '<span class="dsh-claude-ban-action-desc">' + banCopy('exportDesc', 'We\u2019ll package up your conversations, projects, and settings for download. This might take some time to complete.') + '</span>' +
8019
+ '</span>' +
8020
+ '<span class="dsh-claude-ban-action-chevron">' + BAN_ICONS.chevron + '</span>' +
8021
+ '</button>' +
8022
+ '<button type="button" class="dsh-claude-ban-action" data-dsh-ban-dismiss>' +
8023
+ '<span class="dsh-claude-ban-action-icon">' + BAN_ICONS.trash + '</span>' +
8024
+ '<span class="dsh-claude-ban-action-text">' +
8025
+ '<span class="dsh-claude-ban-action-title dsh-claude-ban-action-title-danger">' + banCopy('deleteTitle', 'Delete your account') + '</span>' +
8026
+ '<span class="dsh-claude-ban-action-desc">' + banCopy('deleteDesc', 'You can permanently delete your account and data. This can\u2019t be undone.') + '</span>' +
8027
+ '</span>' +
8028
+ '<span class="dsh-claude-ban-action-chevron">' + BAN_ICONS.chevron + '</span>' +
8029
+ '</button>' +
8030
+ '</div>' +
8031
+ '</div>' +
8032
+ '</div>'
8033
+
8034
+ // One listener for every way out that is a click: the markup marks each
8035
+ // control with `data-dsh-ban-dismiss`, and a click that lands on the
8036
+ // page's empty canvas stays put (so the page can still be read). The
8037
+ // keyboard way out is Esc, handled with the other overlays in
8038
+ // scheduler.js — deliberately not a window `blur`, which would close
8039
+ // the page the moment the reader switched windows to look something up.
8040
+ root.addEventListener('click', function (e) {
8041
+ if (isBanDismissTarget(e.target)) closeBanScreen()
8042
+ })
8043
+
8044
+ banRoot = root
8045
+ document.body.appendChild(root)
8046
+ }
8047
+
8048
+ // The account row reaches this through the shared `ui` handle registry —
8049
+ // the same discipline the scheduler and the other features use — so the
8050
+ // handle must be REGISTERED here, not merely returned. (The account row is
8051
+ // wired in account-footer.js before this runs, but it only reads
8052
+ // `ui.ban` at click time, so the order is safe either way.)
8053
+ ui.ban = {
8054
+ open: openBanScreen,
8055
+ close: closeBanScreen,
8056
+ isOpen: function () {
8057
+ return banRoot !== null
8058
+ },
8059
+ /**
8060
+ * Rebuild an OPEN overlay in place — the page is assembled once, so a
8061
+ * change of the language preference (or of the brand mark) would
8062
+ * otherwise only land the next time it is opened. A no-op while closed,
8063
+ * and the hold timestamp is kept so a re-render never re-dates the page
8064
+ * under the reader.
8065
+ */
8066
+ refresh: function () {
8067
+ if (banRoot === null) return
8068
+ openBanScreen(banOpenedAt === null ? new Date() : banOpenedAt)
8069
+ },
8070
+ }
8071
+
8072
+ return closeBanScreen
8073
+ }
8074
+
7128
8075
  // ============================================================================
7129
8076
  // 响应式调度与生命周期清理 (Scheduler & Teardown)
7130
8077
  // ============================================================================
@@ -7146,6 +8093,10 @@ window.__ModuleLoader__.load({
7146
8093
  if (ui.footer) ui.footer.close()
7147
8094
  if (ui.permissions) ui.permissions.closeMenu()
7148
8095
  if (ui.model) ui.model.close()
8096
+ // The account-hold overlay is the one layer that does NOT close on a
8097
+ // window blur (it is meant to be read, and reading it may mean
8098
+ // switching windows), so Esc is its keyboard way out.
8099
+ if (ui.ban) ui.ban.close()
7149
8100
  }
7150
8101
  if ((e.ctrlKey || e.metaKey) && e.key === ',') {
7151
8102
  e.preventDefault()
@@ -7231,6 +8182,9 @@ window.__ModuleLoader__.load({
7231
8182
  var prefsUnsubscribe = null
7232
8183
  prefsUnsubscribe = subscribePrefs(function () {
7233
8184
  if (ui.model) ui.model.invalidateCopy()
8185
+ // The account-hold page is assembled once per open, so a language change
8186
+ // has to rebuild an open one (a no-op while it is closed).
8187
+ if (ui.ban) ui.ban.refresh()
7234
8188
  schedule()
7235
8189
  })
7236
8190
  loadPrefs()
@@ -7339,7 +8293,7 @@ window.__ModuleLoader__.load({
7339
8293
  document.removeEventListener('compositionend', onComposerInput, true)
7340
8294
  // Safety-net DOM sweep. Feature teardowns run after this and tolerate
7341
8295
  // nodes already being detached.
7342
- var leftoverItems = document.querySelectorAll('.dsh-claude-popover-item, .dsh-claude-popover-embed, .dsh-claude-account-popover, .dsh-claude-account-btn, .dsh-claude-perm-container, .dsh-claude-perm-popover, .dsh-claude-segments[data-composer-segments], .dsh-claude-model-btn, .dsh-claude-model-popover, [data-dsh-synthetic-placeholder]')
8296
+ var leftoverItems = document.querySelectorAll('.dsh-claude-popover-item, .dsh-claude-popover-embed, .dsh-claude-account-popover, .dsh-claude-account-btn, .dsh-claude-perm-container, .dsh-claude-perm-popover, .dsh-claude-segments[data-composer-segments], .dsh-claude-model-btn, .dsh-claude-model-popover, .dsh-claude-ban, [data-dsh-synthetic-placeholder]')
7343
8297
  for (var li = 0; li < leftoverItems.length; li++) {
7344
8298
  if (leftoverItems[li].parentElement) {
7345
8299
  leftoverItems[li].parentElement.removeChild(leftoverItems[li])
@@ -7507,6 +8461,10 @@ window.__ModuleLoader__.load({
7507
8461
  { value: 'conversation', label: settingsCopy('scopeConversation', 'Conversation only') },
7508
8462
  { value: 'all', label: settingsCopy('scopeAll', 'All') },
7509
8463
  ]
8464
+ var banLocaleOptions = [
8465
+ { value: BAN_LOCALE_ZH, label: settingsCopy('banLocaleZh', '中文') },
8466
+ { value: BAN_LOCALE_EN, label: settingsCopy('banLocaleEn', 'English') },
8467
+ ]
7510
8468
 
7511
8469
  var rows = [
7512
8470
  row(
@@ -7562,6 +8520,12 @@ window.__ModuleLoader__.load({
7562
8520
  settingsCopy('composerDesc', 'Which input area the skin restyles: the new-conversation page, the conversation, or both.'),
7563
8521
  segment(scopeOptions, prefs.composerScope, function (value) { write({ composerScope: value }) }),
7564
8522
  ),
8523
+ row(
8524
+ 'banLocale',
8525
+ settingsCopy('banLocaleTitle', 'Account-hold easter egg language'),
8526
+ settingsCopy('banLocaleDesc', 'The language the account-hold page (click the account row in the sidebar footer popover) is written in. It is its own choice, so the page reads the way Claude wrote it whatever the interface language is.'),
8527
+ segment(banLocaleOptions, prefs.banLocale, function (value) { write({ banLocale: value }) }),
8528
+ ),
7565
8529
  ]
7566
8530
 
7567
8531
  if (error !== null) {
@@ -7657,6 +8621,7 @@ window.__ModuleLoader__.load({
7657
8621
  teardowns.push(installPermissions(ctx, ui))
7658
8622
  teardowns.push(installModelPicker(ctx, ui))
7659
8623
  teardowns.push(installAccountFooter(ctx, ui))
8624
+ teardowns.push(installBanScreen(ctx, ui)) // 账户横条的封号彩蛋(账户弹层把点击交给 ui.ban)
7660
8625
  teardowns.push(installScheduler(ctx, ui)) // 最后装,回调中惰性读 ui 句柄
7661
8626
  var stopSettings = installSettingsSection(ctx)
7662
8627