openclacky 1.3.5 → 1.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -0
  3. data/lib/clacky/agent/message_compressor.rb +32 -8
  4. data/lib/clacky/agent/message_compressor_helper.rb +113 -12
  5. data/lib/clacky/agent.rb +8 -4
  6. data/lib/clacky/agent_profile.rb +121 -53
  7. data/lib/clacky/brand_config.rb +309 -6
  8. data/lib/clacky/cli.rb +4 -58
  9. data/lib/clacky/default_extensions/coding/ext.yml +18 -0
  10. data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/system_prompt.md +95 -0
  11. data/lib/clacky/default_extensions/ext-studio/api/handler.rb +254 -0
  12. data/lib/clacky/default_extensions/ext-studio/ext.yml +32 -0
  13. data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +1269 -0
  14. data/lib/clacky/default_extensions/ext-studio/skills/ext-debug/SKILL.md +71 -0
  15. data/lib/clacky/default_extensions/ext-studio/skills/ext-publish/SKILL.md +74 -0
  16. data/lib/clacky/default_extensions/ext-studio/skills/ext-scaffold/SKILL.md +65 -0
  17. data/lib/clacky/default_extensions/general/ext.yml +18 -0
  18. data/lib/clacky/default_extensions/git/ext.yml +12 -0
  19. data/lib/clacky/{default_agents/_panels/git/panel.js → default_extensions/git/panels/git/view.js} +1 -2
  20. data/lib/clacky/default_extensions/meeting/{handler.rb → api/handler.rb} +78 -26
  21. data/lib/clacky/default_extensions/meeting/ext.yml +15 -0
  22. data/lib/clacky/default_extensions/meeting/{meeting.js → panels/meeting/view.js} +266 -89
  23. data/lib/clacky/default_extensions/meeting/skills/meeting-summarizer/SKILL.md +2 -1
  24. data/lib/clacky/default_extensions/time_machine/ext.yml +12 -0
  25. data/lib/clacky/{default_agents/_panels/time_machine/panel.js → default_extensions/time_machine/panels/time_machine/view.js} +58 -47
  26. data/lib/clacky/default_skills/channel-manager/discord_setup.rb +1 -1
  27. data/lib/clacky/default_skills/extend-openclacky/SKILL.md +83 -18
  28. data/lib/clacky/{api_extension.rb → extension/api_extension.rb} +27 -11
  29. data/lib/clacky/extension/api_loader.rb +136 -0
  30. data/lib/clacky/extension/cli_commands.rb +226 -0
  31. data/lib/clacky/{server/api_extension_dispatcher.rb → extension/dispatcher.rb} +22 -9
  32. data/lib/clacky/extension/hook_loader.rb +77 -0
  33. data/lib/clacky/extension/loader.rb +483 -0
  34. data/lib/clacky/extension/packager.rb +226 -0
  35. data/lib/clacky/{patch_loader.rb → extension/patch_loader.rb} +45 -0
  36. data/lib/clacky/extension/scaffold/template_renderer.rb +64 -0
  37. data/lib/clacky/extension/scaffold/templates/full/README.md.erb +48 -0
  38. data/lib/clacky/extension/scaffold/templates/full/agents/designer.md +5 -0
  39. data/lib/clacky/extension/scaffold/templates/full/api/handler.rb.erb +16 -0
  40. data/lib/clacky/extension/scaffold/templates/full/channels/noop.rb.erb +40 -0
  41. data/lib/clacky/extension/scaffold/templates/full/ext.yml.erb +41 -0
  42. data/lib/clacky/extension/scaffold/templates/full/hooks/audit.rb +9 -0
  43. data/lib/clacky/extension/scaffold/templates/full/panels/dashboard/view.js.erb +194 -0
  44. data/lib/clacky/extension/scaffold/templates/full/patches/audit.rb +15 -0
  45. data/lib/clacky/extension/scaffold/templates/full/skills/__slug__-skill/SKILL.md.erb +8 -0
  46. data/lib/clacky/extension/scaffold/templates/hello/api/handler.rb.erb +9 -0
  47. data/lib/clacky/extension/scaffold/templates/hello/ext.yml.erb +12 -0
  48. data/lib/clacky/extension/scaffold/templates/hello/panels/hello/view.js.erb +31 -0
  49. data/lib/clacky/extension/scaffold.rb +55 -0
  50. data/lib/clacky/extension/verifier.rb +196 -0
  51. data/lib/clacky/identity.rb +70 -0
  52. data/lib/clacky/locales/en.rb +19 -1
  53. data/lib/clacky/locales/zh.rb +19 -1
  54. data/lib/clacky/platform_http_client.rb +18 -15
  55. data/lib/clacky/server/channel/extension_adapter_loader.rb +32 -0
  56. data/lib/clacky/server/channel.rb +6 -0
  57. data/lib/clacky/server/http_server.rb +435 -263
  58. data/lib/clacky/server/session_registry.rb +59 -3
  59. data/lib/clacky/session_manager.rb +35 -4
  60. data/lib/clacky/skill_loader.rb +28 -1
  61. data/lib/clacky/ui2/layout_manager.rb +0 -5
  62. data/lib/clacky/ui2/progress_handle.rb +0 -3
  63. data/lib/clacky/ui2/ui_controller.rb +9 -15
  64. data/lib/clacky/version.rb +1 -1
  65. data/lib/clacky/web/app.css +782 -554
  66. data/lib/clacky/web/app.js +63 -15
  67. data/lib/clacky/web/auth.js +2 -0
  68. data/lib/clacky/web/components/notify.js +2 -0
  69. data/lib/clacky/web/components/sidebar.js +2 -8
  70. data/lib/clacky/web/core/ext.js +316 -79
  71. data/lib/clacky/web/features/backup/store.js +24 -0
  72. data/lib/clacky/web/features/backup/view.js +49 -23
  73. data/lib/clacky/web/features/brand/view.js +13 -5
  74. data/lib/clacky/web/features/extensions/store.js +184 -0
  75. data/lib/clacky/web/features/extensions/view.js +389 -0
  76. data/lib/clacky/web/features/new-session/store.js +186 -0
  77. data/lib/clacky/web/features/new-session/view.js +319 -0
  78. data/lib/clacky/web/features/share/view.js +63 -14
  79. data/lib/clacky/web/features/skills/store.js +3 -1
  80. data/lib/clacky/web/features/skills/view.js +1 -1
  81. data/lib/clacky/web/features/tasks/view.js +88 -27
  82. data/lib/clacky/web/features/trash/store.js +24 -6
  83. data/lib/clacky/web/features/trash/view.js +46 -9
  84. data/lib/clacky/web/features/workspace/store.js +2 -0
  85. data/lib/clacky/web/features/workspace/view.js +0 -1
  86. data/lib/clacky/web/i18n.js +140 -108
  87. data/lib/clacky/web/index.html +190 -214
  88. data/lib/clacky/web/sessions.js +99 -304
  89. data/lib/clacky/web/settings.js +1 -1
  90. data/lib/clacky/web/skills.js +2 -0
  91. data/lib/clacky/web/theme.js +2 -0
  92. data/lib/clacky/web/ws-dispatcher.js +2 -1
  93. data/lib/clacky/web/ws.js +2 -0
  94. data/lib/clacky.rb +21 -10
  95. metadata +55 -24
  96. data/benchmark/runner.rb +0 -441
  97. data/lib/clacky/api_extension_loader.rb +0 -168
  98. data/lib/clacky/default_agents/SOUL.md +0 -3
  99. data/lib/clacky/default_agents/USER.md +0 -1
  100. data/lib/clacky/default_agents/coding/profile.yml +0 -5
  101. data/lib/clacky/default_agents/coding/webui/.gitkeep +0 -0
  102. data/lib/clacky/default_agents/general/profile.yml +0 -2
  103. data/lib/clacky/default_extensions/meeting/meta.yml +0 -3
  104. data/lib/clacky/web/features/creator/store.js +0 -81
  105. data/lib/clacky/web/features/creator/view.js +0 -380
  106. /data/lib/clacky/{default_agents → default_extensions/coding/agents}/coding/system_prompt.md +0 -0
  107. /data/lib/clacky/{default_agents → default_extensions/general/agents}/general/system_prompt.md +0 -0
  108. /data/lib/clacky/{default_agents/base_prompt.md → prompts/base.md} +0 -0
@@ -607,6 +607,21 @@ body {
607
607
  }
608
608
  #session-list { padding: 4px 0 0; min-height: 6.75rem; }
609
609
 
610
+ /* ── Extension nav slots (top / mid / bottom) ───────────────────────────── */
611
+ [id^="ext-slot-sidebar-nav"] { display: block; }
612
+ [id^="ext-slot-sidebar-nav"]:empty { display: none; }
613
+ #ext-slot-sidebar-nav-top {
614
+ padding: 8px 0 10px;
615
+ margin-bottom: 6px;
616
+ border-bottom: 1px solid var(--color-border-secondary);
617
+ }
618
+ #ext-slot-sidebar-nav { padding: 6px 0 4px; }
619
+ #ext-slot-sidebar-nav-bottom {
620
+ padding: 8px 0 10px;
621
+ margin-top: 6px;
622
+ border-top: 1px solid var(--color-border-secondary);
623
+ }
624
+
610
625
  /* ── Sidebar divider (Section Labels) ───────────────────────────────────── */
611
626
  .sidebar-divider {
612
627
  display: flex;
@@ -645,19 +660,12 @@ body {
645
660
  gap: 4px;
646
661
  }
647
662
 
648
- /* ── Split button [+ ▾] ─────────────────────────────────────────────────── */
649
- .btn-split-wrap {
650
- position: relative;
651
- display: flex;
652
- align-items: center;
653
- border-radius: 6px;
654
- overflow: visible;
655
- }
663
+ /* ── New Session button ──────────────────────────────────────────────────── */
656
664
  .btn-split-main {
657
665
  height: 1.5rem;
658
666
  padding: 0 0.625rem;
659
667
  border: none;
660
- border-radius: 6px 0 0 6px;
668
+ border-radius: 6px;
661
669
  background: var(--color-accent-primary);
662
670
  color: #fff;
663
671
  font-size: 0.75rem;
@@ -671,51 +679,6 @@ body {
671
679
  background: var(--color-button-primary-hover);
672
680
  box-shadow: 0 2px 6px rgba(0,0,0,0.15);
673
681
  }
674
- .btn-split-arrow {
675
- height: 1.5rem;
676
- padding: 0 0.35rem;
677
- border: none;
678
- border-left: 1px solid rgba(255,255,255,0.3);
679
- border-radius: 0 6px 6px 0;
680
- background: var(--color-accent-primary);
681
- color: #fff;
682
- font-size: 0.75rem;
683
- cursor: pointer;
684
- transition: background 0.15s;
685
- }
686
- .btn-split-arrow:hover {
687
- background: var(--color-button-primary-hover);
688
- }
689
-
690
- /* ── Dropdown menu ───────────────────────────────────────────────────────── */
691
- .new-session-dropdown {
692
- position: absolute;
693
- top: 100%;
694
- right: 0;
695
- min-width: 11.25rem;
696
- background: var(--color-bg-card);
697
- border: 1px solid var(--color-border-primary);
698
- border-radius: 7px;
699
- box-shadow: var(--shadow-md);
700
- z-index: 200;
701
- padding: 0.375rem 0 0.25rem;
702
- overflow: hidden;
703
- }
704
- .new-session-dropdown[hidden] { display: none; }
705
- .dropdown-item {
706
- padding: 0.4rem 0.875rem;
707
- font-size: 0.8125rem;
708
- color: var(--color-text-secondary);
709
- cursor: pointer;
710
- white-space: nowrap;
711
- transition: all 0.12s;
712
- display: flex;
713
- align-items: center;
714
- }
715
- .dropdown-item:hover {
716
- background: var(--color-bg-hover);
717
- color: var(--color-accent-primary);
718
- }
719
682
 
720
683
  /* ── Session source badge ────────────────────────────────────────────────── */
721
684
  /* Design: compact neutral chips — the visual weight is carried by the
@@ -769,6 +732,21 @@ body {
769
732
  .session-item.active .session-badge--coding {
770
733
  color: var(--color-text-tertiary);
771
734
  }
735
+ /* Agent profile: extension / custom agents — same hollow neutral base as
736
+ coding, but a subtle accent tint keeps user-defined agents visually
737
+ distinct from the built-in "coding" tag. */
738
+ .session-badge--agent {
739
+ background: transparent;
740
+ color: var(--color-accent-primary);
741
+ border-color: var(--color-accent-soft);
742
+ max-width: 8rem;
743
+ overflow: hidden;
744
+ text-overflow: ellipsis;
745
+ white-space: nowrap;
746
+ }
747
+ .session-item.active .session-badge--agent {
748
+ border-color: var(--color-accent-primary);
749
+ }
772
750
 
773
751
 
774
752
  /* ── Sidebar divider actions group ───────────────────────────────────────── */
@@ -1516,6 +1494,23 @@ body {
1516
1494
  background: var(--color-accent-primary);
1517
1495
  }
1518
1496
 
1497
+ /* Extension nav mounts are wrapped by ext.js; the Router stamps .active on the
1498
+ wrapper, so the highlight is forwarded to the inner nav item. */
1499
+ [data-ext-workspace].active > .task-item {
1500
+ background: var(--color-accent-soft);
1501
+ }
1502
+ [data-ext-workspace].active > .task-item::before {
1503
+ content: "";
1504
+ position: absolute;
1505
+ left: -10px;
1506
+ top: 50%;
1507
+ transform: translateY(-50%);
1508
+ width: 3px;
1509
+ height: 17px;
1510
+ border-radius: 0 3px 3px 0;
1511
+ background: var(--color-accent-primary);
1512
+ }
1513
+
1519
1514
  .task-row {
1520
1515
  display: flex;
1521
1516
  align-items: center;
@@ -1839,6 +1834,14 @@ body {
1839
1834
  background: var(--color-bg-secondary);
1840
1835
  transition: background-color var(--transition-base);
1841
1836
  }
1837
+
1838
+ /* Extension workspace slot: give any registered workspace the same page
1839
+ chrome as built-in pages (padding + scroll) so extensions don't reinvent it. */
1840
+ #ext-slot-main-workspace {
1841
+ flex: 1;
1842
+ overflow-y: auto;
1843
+ padding: 2rem 2rem 1.5rem;
1844
+ }
1842
1845
  .centered {
1843
1846
  flex: 1;
1844
1847
  display: flex;
@@ -1849,80 +1852,263 @@ body {
1849
1852
  color: var(--color-text-secondary);
1850
1853
  }
1851
1854
 
1852
- /* ── Empty / welcome state agent "standing by" cockpit ─────────────────── */
1853
- .ce-mark {
1854
- width: 3.25rem;
1855
- height: 3.25rem;
1856
- border-radius: 0.875rem;
1857
- background: var(--color-accent-soft);
1858
- display: grid;
1859
- place-items: center;
1855
+ /* ── New Session landing page (#new) ─────────────────────────────────────── */
1856
+ .new-session-page {
1857
+ justify-content: flex-start;
1858
+ padding: 3rem 1.5rem 2rem;
1859
+ overflow-y: auto;
1860
+ gap: 0;
1860
1861
  }
1861
- .ce-mark svg { width: 1.625rem; height: 1.625rem; color: var(--color-accent-primary); }
1862
- .ce-head {
1862
+ .new-session-inner {
1863
+ width: 100%;
1864
+ max-width: 44rem;
1863
1865
  display: flex;
1864
1866
  flex-direction: column;
1865
- gap: 0.375rem;
1866
- align-items: center;
1867
+ gap: 1.5rem;
1867
1868
  }
1868
- .ce-title {
1869
- font-size: 1.3125rem;
1869
+ .new-session-title {
1870
+ font-size: 1.5rem;
1870
1871
  font-weight: 680;
1871
1872
  color: var(--color-text-primary);
1872
1873
  letter-spacing: -0.01em;
1873
1874
  text-align: center;
1875
+ margin: 0;
1874
1876
  }
1875
- .ce-sub {
1877
+ .new-session-subtitle {
1876
1878
  color: var(--color-text-tertiary);
1877
- font-size: 0.84375rem;
1879
+ font-size: 0.875rem;
1878
1880
  text-align: center;
1881
+ margin: 0;
1879
1882
  }
1880
- .chips {
1883
+ .new-session-agents {
1881
1884
  display: flex;
1882
- gap: 0.625rem;
1883
1885
  flex-wrap: wrap;
1884
- justify-content: center;
1885
- max-width: 34rem;
1886
+ gap: 0.75rem;
1887
+ justify-content: flex-start;
1886
1888
  }
1887
- .chip {
1888
- display: flex;
1889
- align-items: center;
1890
- gap: 0.5625rem;
1891
- padding: 0.6875rem 0.9375rem;
1889
+ .agent-card {
1890
+ position: relative;
1891
+ flex: 1 1 12rem;
1892
+ min-width: 11rem;
1893
+ max-width: 15rem;
1894
+ padding: 0.9375rem 1rem;
1892
1895
  border: 1px solid var(--color-border-primary);
1893
- border-radius: 0.625rem;
1896
+ border-radius: 0.75rem;
1894
1897
  background: var(--color-bg-primary);
1895
1898
  cursor: pointer;
1896
1899
  text-align: left;
1897
- transition: border-color 0.14s, transform 0.14s;
1900
+ transition: border-color 0.14s, background-color 0.14s, transform 0.14s;
1901
+ display: flex;
1902
+ flex-direction: column;
1903
+ gap: 0.25rem;
1898
1904
  }
1899
- .chip:hover {
1900
- border-color: color-mix(in srgb, var(--color-accent-primary) 45%, var(--color-border-primary));
1905
+ .agent-card:hover {
1906
+ border-color: color-mix(in srgb, var(--color-accent-primary) 40%, var(--color-border-primary));
1901
1907
  transform: translateY(-1px);
1902
1908
  }
1903
- .chip .ci {
1904
- width: 1.875rem;
1905
- height: 1.875rem;
1906
- border-radius: 0.5rem;
1909
+ .agent-card--selected {
1910
+ border-color: var(--color-accent-primary);
1911
+ background: var(--color-accent-soft);
1912
+ }
1913
+ .agent-card-title {
1914
+ font-size: 0.9375rem;
1915
+ font-weight: 620;
1916
+ color: var(--color-text-primary);
1917
+ display: flex;
1918
+ align-items: center;
1919
+ gap: 0.375rem;
1920
+ }
1921
+ .agent-card-new {
1922
+ font-size: 0.6rem;
1923
+ font-weight: 700;
1924
+ line-height: 1;
1925
+ padding: 2px 5px;
1926
+ border-radius: 4px;
1927
+ background: color-mix(in srgb, #16a34a 18%, transparent);
1928
+ color: #16a34a;
1929
+ letter-spacing: 0.04em;
1930
+ }
1931
+ .agent-card-desc {
1932
+ font-size: 0.78125rem;
1933
+ color: var(--color-text-tertiary);
1934
+ line-height: 1.4;
1935
+ }
1936
+ .agent-card-badge {
1937
+ position: absolute;
1938
+ top: 0.5rem;
1939
+ right: 0.5rem;
1940
+ font-size: 0.65rem;
1941
+ font-weight: 600;
1942
+ padding: 1px 5px;
1943
+ border-radius: 4px;
1907
1944
  background: var(--color-bg-hover);
1908
- display: grid;
1909
- place-items: center;
1910
- flex-shrink: 0;
1945
+ color: var(--color-text-secondary);
1946
+ letter-spacing: 0.02em;
1947
+ text-transform: uppercase;
1911
1948
  }
1912
- .chip .ci svg { width: 1rem; height: 1rem; color: var(--color-text-secondary); }
1913
- .chip .ct-wrap { display: flex; flex-direction: column; gap: 1px; }
1914
- .chip .ct { font-size: 0.8125rem; color: var(--color-text-primary); font-weight: 550; }
1915
- .chip .cd { font-size: 0.71875rem; color: var(--color-text-tertiary); }
1916
- #btn-welcome-new {
1917
- background: transparent;
1949
+ .agent-card-badge--custom {
1950
+ background: color-mix(in srgb, var(--color-accent-primary) 15%, transparent);
1951
+ color: var(--color-accent-primary);
1952
+ }
1953
+ .agent-card-author {
1954
+ font-size: 0.72rem;
1918
1955
  color: var(--color-text-tertiary);
1956
+ opacity: 0.8;
1957
+ }
1958
+
1959
+ .new-session-composer {
1960
+ display: flex;
1961
+ flex-direction: column;
1962
+ gap: 0.5rem;
1963
+ border: 1px solid var(--color-border-primary);
1964
+ border-radius: 0.75rem;
1965
+ padding: 0.75rem;
1966
+ background: var(--color-bg-primary);
1967
+ }
1968
+ .new-session-textarea {
1969
+ width: 100%;
1970
+ border: none;
1971
+ outline: none;
1972
+ resize: vertical;
1973
+ background: transparent;
1974
+ color: var(--color-text-primary);
1975
+ font: inherit;
1976
+ font-size: 0.9375rem;
1977
+ line-height: 1.5;
1978
+ padding: 0.25rem;
1979
+ min-height: 3rem;
1980
+ max-height: 12rem;
1981
+ }
1982
+ .new-session-composer-actions {
1983
+ display: flex;
1984
+ align-items: center;
1985
+ justify-content: flex-end;
1986
+ gap: 0.5rem;
1987
+ }
1988
+ .new-session-advanced-wrap {
1989
+ display: flex;
1990
+ flex-direction: column;
1991
+ gap: 0.5rem;
1992
+ align-items: flex-start;
1993
+ }
1994
+ .new-session-advanced-toggle {
1995
+ display: inline-flex;
1996
+ align-items: center;
1997
+ gap: 0.375rem;
1919
1998
  border: none;
1999
+ background: transparent;
2000
+ color: var(--color-text-tertiary);
2001
+ font-size: 0.8125rem;
2002
+ cursor: pointer;
1920
2003
  padding: 0.25rem 0.5rem;
2004
+ border-radius: 0.375rem;
2005
+ transition: color var(--transition-fast), background-color var(--transition-fast);
2006
+ }
2007
+ .new-session-advanced-toggle:hover {
2008
+ color: var(--color-text-secondary);
2009
+ background: var(--color-bg-hover);
2010
+ }
2011
+ .new-session-advanced-caret {
2012
+ transition: transform 0.15s;
2013
+ }
2014
+ .new-session-advanced-toggle.is-open .new-session-advanced-caret {
2015
+ transform: rotate(180deg);
2016
+ }
2017
+ .new-session-send {
2018
+ padding: 0.4375rem 1rem;
2019
+ border: none;
2020
+ border-radius: 0.5rem;
2021
+ background: var(--color-accent-primary);
2022
+ color: var(--color-text-inverse, #fff);
2023
+ font-size: 0.875rem;
2024
+ font-weight: 550;
2025
+ cursor: pointer;
2026
+ transition: opacity 0.14s;
2027
+ }
2028
+ .new-session-send:disabled {
2029
+ opacity: 0.45;
2030
+ cursor: not-allowed;
2031
+ }
2032
+ .new-session-send:not(:disabled):hover {
2033
+ opacity: 0.9;
2034
+ }
2035
+
2036
+ .new-session-advanced {
2037
+ display: flex;
2038
+ flex-direction: column;
2039
+ gap: 0.75rem;
2040
+ padding: 0.9375rem;
2041
+ border: 1px solid var(--color-border-primary);
2042
+ border-radius: 0.75rem;
2043
+ background: var(--color-bg-secondary);
2044
+ align-self: stretch;
2045
+ }
2046
+ .new-session-advanced[hidden] {
2047
+ display: none;
2048
+ }
2049
+ .new-session-field {
2050
+ display: flex;
2051
+ flex-direction: column;
2052
+ gap: 0.3125rem;
2053
+ }
2054
+ .new-session-label {
2055
+ font-size: 0.78125rem;
2056
+ color: var(--color-text-secondary);
2057
+ font-weight: 540;
2058
+ }
2059
+ .new-session-input,
2060
+ .new-session-select {
2061
+ width: 100%;
2062
+ padding: 0.4375rem 0.625rem;
2063
+ border: 1px solid var(--color-border-primary);
2064
+ border-radius: 0.4375rem;
2065
+ background: var(--color-bg-primary);
2066
+ color: var(--color-text-primary);
2067
+ font-size: 0.8125rem;
2068
+ font-family: inherit;
2069
+ }
2070
+ .new-session-input:focus,
2071
+ .new-session-select:focus {
2072
+ outline: none;
2073
+ border-color: var(--color-accent-primary);
2074
+ }
2075
+ .new-session-input-row {
2076
+ display: flex;
2077
+ gap: 0.375rem;
2078
+ }
2079
+ .new-session-input-row .new-session-input {
2080
+ flex: 1;
2081
+ }
2082
+ .new-session-browse-btn {
2083
+ padding: 0 0.625rem;
2084
+ border: 1px solid var(--color-border-primary);
2085
+ border-radius: 0.4375rem;
2086
+ background: var(--color-bg-primary);
2087
+ color: var(--color-text-secondary);
2088
+ cursor: pointer;
2089
+ display: grid;
2090
+ place-items: center;
2091
+ transition: border-color var(--transition-fast), color var(--transition-fast);
2092
+ }
2093
+ .new-session-browse-btn:hover {
2094
+ border-color: var(--color-accent-primary);
2095
+ color: var(--color-accent-primary);
2096
+ }
2097
+ .new-session-checkbox-field {
2098
+ display: flex;
2099
+ align-items: center;
2100
+ }
2101
+ .new-session-checkbox-label {
2102
+ display: inline-flex;
2103
+ align-items: center;
2104
+ gap: 0.5rem;
1921
2105
  font-size: 0.8125rem;
2106
+ color: var(--color-text-secondary);
2107
+ cursor: pointer;
2108
+ }
2109
+ .new-session-checkbox {
1922
2110
  cursor: pointer;
1923
- transition: color var(--transition-fast);
1924
2111
  }
1925
- #btn-welcome-new:hover { color: var(--color-text-secondary); text-decoration: underline; }
1926
2112
 
1927
2113
 
1928
2114
  /* ── Chat panel ──────────────────────────────────────────────────────────── */
@@ -4486,6 +4672,7 @@ body {
4486
4672
  border-radius: 10px;
4487
4673
  padding: 0.625rem 0.875rem;
4488
4674
  background: var(--color-bg-secondary);
4675
+ margin-bottom: 0.625rem;
4489
4676
  }
4490
4677
  .backup-auto-card .backup-auto-row {
4491
4678
  margin: 0.25rem 0;
@@ -4517,17 +4704,69 @@ body {
4517
4704
  font-size: 0.75rem;
4518
4705
  color: var(--color-text-secondary);
4519
4706
  }
4520
- .backup-actions {
4707
+ .backup-dest-row {
4521
4708
  display: flex;
4522
4709
  align-items: center;
4523
- gap: 0.75rem;
4524
- flex-wrap: wrap;
4525
- }
4526
-
4527
- .settings-network-url {
4528
- display: flex;
4529
- flex-direction: column;
4530
- gap: 0.375rem;
4710
+ gap: 0.5rem;
4711
+ margin: 0.625rem 0 0.25rem;
4712
+ padding-top: 0.625rem;
4713
+ border-top: 1px solid var(--color-border-primary);
4714
+ }
4715
+ .backup-dest-label {
4716
+ font-size: 0.78125rem;
4717
+ color: var(--color-text-secondary);
4718
+ white-space: nowrap;
4719
+ flex-shrink: 0;
4720
+ }
4721
+ .backup-dest-path {
4722
+ font-size: 0.78125rem;
4723
+ color: var(--color-text-primary);
4724
+ font-family: var(--font-mono, monospace);
4725
+ overflow: hidden;
4726
+ text-overflow: ellipsis;
4727
+ white-space: nowrap;
4728
+ }
4729
+ .btn-settings-link {
4730
+ flex-shrink: 0;
4731
+ background: transparent;
4732
+ border: 1px solid var(--color-border-primary);
4733
+ border-radius: 6px;
4734
+ color: var(--color-accent-primary);
4735
+ font-size: 0.75rem;
4736
+ padding: 0.25rem 0.625rem;
4737
+ cursor: pointer;
4738
+ white-space: nowrap;
4739
+ }
4740
+ .btn-settings-link:hover {
4741
+ background: var(--color-bg-hover);
4742
+ border-color: var(--color-accent-primary);
4743
+ }
4744
+ .backup-actions {
4745
+ display: flex;
4746
+ align-items: center;
4747
+ gap: 0.75rem;
4748
+ flex-wrap: wrap;
4749
+ }
4750
+
4751
+ .backup-config-row {
4752
+ margin-top: 0.5rem;
4753
+ padding-top: 0.75rem;
4754
+ border-top: 1px solid var(--color-border);
4755
+ }
4756
+ .btn-settings-action--file {
4757
+ cursor: pointer;
4758
+ }
4759
+ .backup-actions-sep {
4760
+ width: 1px;
4761
+ height: 1.25rem;
4762
+ background: var(--color-border);
4763
+ flex-shrink: 0;
4764
+ }
4765
+
4766
+ .settings-network-url {
4767
+ display: flex;
4768
+ flex-direction: column;
4769
+ gap: 0.375rem;
4531
4770
  }
4532
4771
  .settings-network-url-label {
4533
4772
  font-size: 0.75rem;
@@ -5727,24 +5966,7 @@ body {
5727
5966
  border-color: var(--color-accent-primary);
5728
5967
  }
5729
5968
 
5730
- /* New Session Modal */
5731
- .new-session-modal {
5732
- max-width: 32.5rem;
5733
- padding: 1.25rem 1.25rem 1rem;
5734
- }
5735
- .new-session-modal .modal-header {
5736
- display: flex;
5737
- align-items: center;
5738
- margin-bottom: 0.875rem;
5739
- }
5740
- .new-session-modal .modal-title {
5741
- font-size: 1rem;
5742
- font-weight: 600;
5743
- margin: 0;
5744
- padding: 0;
5745
- border: none;
5746
- color: var(--color-text-primary);
5747
- }
5969
+
5748
5970
  .modal-box .modal-header {
5749
5971
  display: flex;
5750
5972
  align-items: center;
@@ -5869,13 +6091,6 @@ body {
5869
6091
  cursor: pointer;
5870
6092
  accent-color: var(--color-accent-primary);
5871
6093
  }
5872
- .new-session-modal .modal-body {
5873
- gap: 0.75rem;
5874
- }
5875
- .new-session-modal .modal-footer {
5876
- margin-top: 1rem;
5877
- padding-top: 1rem;
5878
- }
5879
6094
  .modal-footer {
5880
6095
  display: flex;
5881
6096
  gap: 0.625rem;
@@ -6234,7 +6449,7 @@ body {
6234
6449
  transition: transform 0.18s;
6235
6450
  }
6236
6451
  .skills-filter-toggle input:checked ~ .skills-filter-toggle-track {
6237
- background: var(--color-accent, #6c63ff);
6452
+ background: var(--color-accent-primary);
6238
6453
  }
6239
6454
  .skills-filter-toggle input:checked ~ .skills-filter-toggle-track::after {
6240
6455
  transform: translateX(0.875rem);
@@ -6257,7 +6472,7 @@ body {
6257
6472
  color: var(--color-text-secondary);
6258
6473
  font-size: 0.8125rem;
6259
6474
  }
6260
- /* Guided CTA card in the empty-skills state — mirrors .creator-new-card */
6475
+ /* Guided CTA card in the empty-skills state */
6261
6476
  .skills-empty-create-btn {
6262
6477
  display: flex;
6263
6478
  align-items: center;
@@ -6724,6 +6939,240 @@ body {
6724
6939
  margin-bottom: 0.625rem;
6725
6940
  }
6726
6941
 
6942
+ /* ── Extension Market ─────────────────────────────────────────────────── */
6943
+ #extensions-body {
6944
+ flex: 1;
6945
+ overflow-y: auto;
6946
+ padding: 1.75rem 2.25rem;
6947
+ display: flex;
6948
+ flex-direction: column;
6949
+ gap: 1.25rem;
6950
+ }
6951
+ .extensions-toolbar {
6952
+ display: flex;
6953
+ align-items: center;
6954
+ gap: 0.5rem;
6955
+ }
6956
+ .extensions-search {
6957
+ flex: 1;
6958
+ min-width: 0;
6959
+ font-size: 0.8125rem;
6960
+ padding: 0.4375rem 0.75rem;
6961
+ border-radius: 6px;
6962
+ border: 1px solid var(--color-border-primary);
6963
+ background: var(--color-bg-secondary);
6964
+ color: var(--color-text-primary);
6965
+ }
6966
+ .extensions-search:focus {
6967
+ outline: none;
6968
+ border-color: var(--color-accent, #6366f1);
6969
+ }
6970
+ .extensions-sort {
6971
+ font-size: 0.8125rem;
6972
+ padding: 0.4375rem 0.5rem;
6973
+ border-radius: 6px;
6974
+ border: 1px solid var(--color-border-primary);
6975
+ background: var(--color-bg-secondary);
6976
+ color: var(--color-text-primary);
6977
+ cursor: pointer;
6978
+ }
6979
+ #extensions-list {
6980
+ display: flex;
6981
+ flex-direction: column;
6982
+ gap: 0.5rem;
6983
+ padding-top: 0.25rem;
6984
+ }
6985
+ .extensions-empty {
6986
+ font-size: 0.8125rem;
6987
+ color: var(--color-text-secondary);
6988
+ text-align: center;
6989
+ padding: 1.5rem 0;
6990
+ }
6991
+ .extension-card {
6992
+ background: var(--color-bg-secondary);
6993
+ border: 1px solid var(--color-border-primary);
6994
+ border-radius: 8px;
6995
+ padding: 0.875rem 1rem;
6996
+ transition: border-color .15s;
6997
+ }
6998
+ .extension-card:hover { border-color: var(--color-text-muted); }
6999
+ .extension-card-main {
7000
+ display: flex;
7001
+ align-items: flex-start;
7002
+ gap: 0.75rem;
7003
+ }
7004
+ .extension-emoji {
7005
+ font-size: 1.5rem;
7006
+ line-height: 1.4;
7007
+ flex-shrink: 0;
7008
+ }
7009
+ .extension-info { flex: 1; min-width: 0; }
7010
+ .extension-title {
7011
+ display: flex;
7012
+ align-items: center;
7013
+ gap: 0.375rem;
7014
+ margin-bottom: 0.25rem;
7015
+ flex-wrap: wrap;
7016
+ }
7017
+ .extension-name {
7018
+ font-size: 0.8125rem;
7019
+ font-weight: 600;
7020
+ color: var(--color-text-primary);
7021
+ }
7022
+ .extension-version {
7023
+ font-size: 0.6875rem;
7024
+ color: var(--color-text-secondary);
7025
+ background: var(--color-bg-tertiary, rgba(255,255,255,0.05));
7026
+ border-radius: 4px;
7027
+ padding: 0.0625rem 0.375rem;
7028
+ }
7029
+ .extension-units {
7030
+ font-size: 0.6875rem;
7031
+ color: var(--color-text-muted);
7032
+ }
7033
+ .extension-installed {
7034
+ font-size: 0.6875rem;
7035
+ color: var(--color-success, #16a34a);
7036
+ background: var(--color-success-bg, rgba(22,163,74,0.12));
7037
+ border-radius: 4px;
7038
+ padding: 0.0625rem 0.375rem;
7039
+ }
7040
+ .extension-desc {
7041
+ font-size: 0.75rem;
7042
+ color: var(--color-text-secondary);
7043
+ line-height: 1.5;
7044
+ margin-bottom: 0.375rem;
7045
+ }
7046
+ .extension-meta {
7047
+ display: flex;
7048
+ align-items: center;
7049
+ gap: 0.75rem;
7050
+ }
7051
+ .extension-homepage {
7052
+ font-size: 0.6875rem;
7053
+ color: var(--color-accent, #6366f1);
7054
+ text-decoration: none;
7055
+ }
7056
+ .extension-homepage:hover { text-decoration: underline; }
7057
+
7058
+ /* Clickable catalog card + detail view */
7059
+ .extension-card-clickable { cursor: pointer; }
7060
+
7061
+ .extension-detail {
7062
+ flex: 1;
7063
+ overflow-y: auto;
7064
+ padding: 1.75rem 2.25rem;
7065
+ }
7066
+ .extension-detail-head { margin-bottom: 1rem; }
7067
+ .extension-detail-back {
7068
+ background: transparent;
7069
+ border: none;
7070
+ color: var(--color-text-secondary);
7071
+ font-size: 0.8125rem;
7072
+ cursor: pointer;
7073
+ padding: 0.25rem 0;
7074
+ }
7075
+ .extension-detail-back:hover { color: var(--color-text-primary); }
7076
+ .extension-detail-hero {
7077
+ display: flex;
7078
+ align-items: flex-start;
7079
+ gap: 0.875rem;
7080
+ padding-bottom: 1rem;
7081
+ border-bottom: 1px solid var(--color-border-primary);
7082
+ }
7083
+ .extension-detail-heading { flex: 1; min-width: 0; }
7084
+ .extension-emoji-lg { font-size: 2.25rem; }
7085
+ .extension-name-lg { font-size: 1.0625rem; }
7086
+ .extension-detail-block { margin-top: 1.25rem; }
7087
+ .extension-detail-block-title {
7088
+ font-size: 0.8125rem;
7089
+ font-weight: 600;
7090
+ color: var(--color-text-primary);
7091
+ margin: 0 0 0.625rem;
7092
+ }
7093
+ .extension-detail-section { margin-bottom: 0.875rem; }
7094
+ .extension-detail-section-title {
7095
+ font-size: 0.6875rem;
7096
+ font-weight: 600;
7097
+ text-transform: uppercase;
7098
+ letter-spacing: 0.03em;
7099
+ color: var(--color-text-muted);
7100
+ margin: 0 0 0.375rem;
7101
+ }
7102
+ .extension-contrib-list,
7103
+ .extension-version-list { list-style: none; margin: 0; padding: 0; }
7104
+ .extension-contrib-item {
7105
+ padding: 0.5rem 0.75rem;
7106
+ background: var(--color-bg-secondary);
7107
+ border: 1px solid var(--color-border-primary);
7108
+ border-radius: 6px;
7109
+ margin-bottom: 0.375rem;
7110
+ }
7111
+ .extension-contrib-title {
7112
+ display: block;
7113
+ font-size: 0.8125rem;
7114
+ font-weight: 600;
7115
+ color: var(--color-text-primary);
7116
+ }
7117
+ .extension-contrib-desc {
7118
+ display: block;
7119
+ font-size: 0.75rem;
7120
+ color: var(--color-text-secondary);
7121
+ line-height: 1.5;
7122
+ margin-top: 0.125rem;
7123
+ }
7124
+ .extension-version-item {
7125
+ padding: 0.5rem 0.75rem;
7126
+ border-bottom: 1px solid var(--color-border-primary);
7127
+ }
7128
+ .extension-version-item:last-child { border-bottom: none; }
7129
+ .extension-version-row {
7130
+ display: flex;
7131
+ align-items: center;
7132
+ gap: 0.5rem;
7133
+ }
7134
+ .extension-version-date {
7135
+ font-size: 0.6875rem;
7136
+ color: var(--color-text-muted);
7137
+ }
7138
+ .extension-version-notes {
7139
+ font-size: 0.75rem;
7140
+ color: var(--color-text-secondary);
7141
+ line-height: 1.5;
7142
+ margin-top: 0.25rem;
7143
+ white-space: pre-wrap;
7144
+ }
7145
+ .extension-detail-loading { display: flex; flex-direction: column; gap: 0.5rem; }
7146
+
7147
+ .extension-detail-actions {
7148
+ display: flex;
7149
+ align-items: center;
7150
+ gap: 0.5rem;
7151
+ margin-top: 0.75rem;
7152
+ }
7153
+ .extension-disabled {
7154
+ font-size: 0.6875rem;
7155
+ color: var(--color-text-secondary);
7156
+ background: var(--color-surface-hover, rgba(0,0,0,0.06));
7157
+ border-radius: 4px;
7158
+ padding: 0.0625rem 0.375rem;
7159
+ }
7160
+ .extension-action {
7161
+ font-size: 0.75rem;
7162
+ padding: 0.3125rem 0.75rem;
7163
+ border-radius: 6px;
7164
+ border: 1px solid var(--color-border);
7165
+ background: var(--color-surface);
7166
+ color: var(--color-text);
7167
+ cursor: pointer;
7168
+ }
7169
+ .extension-action:hover { background: var(--color-surface-hover, rgba(0,0,0,0.04)); }
7170
+ .extension-action-remove {
7171
+ color: var(--color-danger, #dc2626);
7172
+ border-color: var(--color-danger-border, rgba(220,38,38,0.4));
7173
+ }
7174
+ .extension-action-remove:hover { background: var(--color-danger-bg, rgba(220,38,38,0.08)); }
7175
+
6727
7176
  /* Brand Skill card */
6728
7177
  .brand-skill-card {
6729
7178
  background: var(--color-bg-secondary);
@@ -7548,7 +7997,7 @@ body.setup-mode[data-theme="dark"] {
7548
7997
  cursor: pointer;
7549
7998
  transition: background .15s, opacity .15s;
7550
7999
  }
7551
- .setup-submit-btn:hover { background: #2563eb; }
8000
+ .setup-submit-btn:hover { background: var(--color-button-primary-hover); }
7552
8001
  .setup-submit-btn:disabled { opacity: .5; cursor: default; }
7553
8002
 
7554
8003
  /* ── Onboard panel ───────────────────────────────────────────────────────── */
@@ -8131,6 +8580,8 @@ body.setup-mode[data-theme="dark"] {
8131
8580
  flex-shrink: 0;
8132
8581
  }
8133
8582
 
8583
+ .brand-warning-bar > span { flex: 1; }
8584
+
8134
8585
  .brand-warning-bar button {
8135
8586
  background: transparent;
8136
8587
  border: none;
@@ -8141,6 +8592,20 @@ body.setup-mode[data-theme="dark"] {
8141
8592
  opacity: 0.7;
8142
8593
  }
8143
8594
 
8595
+ .brand-warning-bar .brand-warning-renew-btn {
8596
+ background: transparent;
8597
+ border: 1px solid currentColor;
8598
+ border-radius: var(--radius-sm, 4px);
8599
+ color: var(--color-warning);
8600
+ cursor: pointer;
8601
+ font-size: 0.75rem;
8602
+ font-weight: 600;
8603
+ padding: 0.2rem 0.6rem;
8604
+ opacity: 0.9;
8605
+ flex-shrink: 0;
8606
+ white-space: nowrap;
8607
+ }
8608
+
8144
8609
  .brand-warning-bar button:hover { opacity: 1; }
8145
8610
 
8146
8611
  /* ── Brand activation banner (top info bar, replaces full-screen panel) ──── */
@@ -9367,382 +9832,21 @@ body.setup-mode[data-theme="dark"] {
9367
9832
 
9368
9833
  /* ── Mobile responsive (≤48rem) ─────────────────────────────────────────── */
9369
9834
 
9835
+ /* ── Trash panel · Recently Deleted ────────────────────────────────── */
9370
9836
 
9371
- /* ══════════════════════════════════════════════════════════════════════════
9372
- Creator Hub — Creator Center
9373
- ══════════════════════════════════════════════════════════════════════════ */
9374
-
9375
- #creator-panel {
9376
- display: flex;
9377
- flex-direction: column;
9378
- height: 100%;
9379
- overflow: hidden;
9837
+ .trash-loading,
9838
+ .trash-empty {
9839
+ text-align: center;
9840
+ color: var(--color-text-tertiary);
9841
+ font-size: 0.8125rem;
9842
+ padding: 1.5rem 0;
9380
9843
  }
9381
-
9382
- #creator-body {
9383
- flex: 1;
9384
- overflow-y: auto;
9385
- display: flex;
9386
- flex-direction: column;
9387
- padding: 2rem 2rem 3.75rem;
9388
- gap: 1.75rem;
9389
- }
9390
-
9391
- /* ── Section blocks ────────────────────────────────────────────────────── */
9392
- .creator-section-block {
9393
- display: flex;
9394
- flex-direction: column;
9395
- gap: 0.625rem;
9396
- }
9397
-
9398
- .creator-section-header {
9399
- display: flex;
9400
- align-items: baseline;
9401
- gap: 0.625rem;
9402
- padding-bottom: 0.375rem;
9403
- border-bottom: 1px solid var(--color-border-primary);
9404
- margin-bottom: 2px;
9405
- }
9406
-
9407
- .creator-section-label {
9408
- font-size: 0.75rem;
9409
- font-weight: 600;
9410
- color: var(--color-text-secondary);
9411
- text-transform: uppercase;
9412
- letter-spacing: 0.5px;
9413
- }
9414
-
9415
- .creator-section-hint {
9416
- font-size: 0.6875rem;
9417
- color: var(--color-text-muted);
9418
- }
9419
-
9420
- .creator-list {
9421
- display: flex;
9422
- flex-direction: column;
9423
- gap: 0.5rem;
9424
- }
9425
-
9426
- /* ── Skill Card base ───────────────────────────────────────────────────── */
9427
- .creator-skill-card {
9428
- background: var(--color-bg-secondary);
9429
- border: 1px solid var(--color-border-primary);
9430
- border-radius: 8px;
9431
- padding: 0.875rem 1rem;
9432
- margin-bottom: 0.75rem;
9433
- transition: border-color .15s;
9434
- }
9435
- .creator-skill-card:last-child {
9436
- margin-bottom: 0;
9437
- }
9438
- .creator-skill-card:hover { border-color: var(--color-text-muted); }
9439
-
9440
- .creator-card-main {
9441
- display: flex;
9442
- align-items: center;
9443
- gap: 0.75rem;
9444
- }
9445
- .creator-card-info { flex: 1; min-width: 0; }
9446
- .creator-card-actions {
9447
- display: flex;
9448
- align-items: center;
9449
- gap: 0.5rem;
9450
- flex-shrink: 0;
9451
- }
9452
- .creator-card-title {
9453
- display: flex;
9454
- align-items: center;
9455
- gap: 0.5rem;
9456
- margin-bottom: 0.25rem;
9457
- flex-wrap: wrap;
9458
- }
9459
- .creator-skill-name {
9460
- font-size: 0.8125rem;
9461
- font-weight: 600;
9462
- color: var(--color-text-primary);
9463
- }
9464
- .creator-card-desc {
9465
- font-size: 0.75rem;
9466
- color: var(--color-text-tertiary);
9467
- line-height: 1.5;
9468
- white-space: nowrap;
9469
- overflow: hidden;
9470
- text-overflow: ellipsis;
9471
- }
9472
-
9473
- /* ── Card meta row (version + download count) ──────────────────────────── */
9474
- .creator-card-meta {
9475
- display: flex;
9476
- align-items: center;
9477
- gap: 0.75rem;
9478
- margin-top: 0.3125rem;
9479
- }
9480
-
9481
- .creator-version {
9482
- font-size: 0.6875rem;
9483
- color: var(--color-text-muted);
9484
- }
9485
-
9486
- .creator-dl-count {
9487
- display: inline-flex;
9488
- align-items: center;
9489
- gap: 0.25rem;
9490
- font-size: 0.6875rem;
9491
- color: var(--color-text-muted);
9492
- }
9493
-
9494
- /* ── Badges ────────────────────────────────────────────────────────────── */
9495
- .creator-badge {
9496
- font-size: 0.625rem;
9497
- font-weight: 600;
9498
- padding: 2px 0.4375rem;
9499
- border-radius: 10px;
9500
- letter-spacing: 0.3px;
9501
- flex-shrink: 0;
9502
- }
9503
- .creator-badge-published {
9504
- background: var(--color-success-bg);
9505
- color: var(--color-success);
9506
- border: 1px solid var(--color-success-border);
9507
- }
9508
- .creator-badge-local {
9509
- background: rgba(250, 173, 20, 0.1);
9510
- color: #b8860b;
9511
- border: 1px solid rgba(250, 173, 20, 0.3);
9512
- }
9513
- [data-theme="dark"] .creator-badge-local {
9514
- color: #f5c842;
9515
- background: rgba(245, 200, 66, 0.1);
9516
- border-color: rgba(245, 200, 66, 0.25);
9517
- }
9518
-
9519
- /* "Has local changes" badge — orange dot */
9520
- .creator-changes-badge {
9521
- font-size: 0.6875rem;
9522
- font-weight: 500;
9523
- color: #d97706;
9524
- flex-shrink: 0;
9525
- }
9526
- [data-theme="dark"] .creator-changes-badge {
9527
- color: #fbbf24;
9528
- }
9529
-
9530
- /* Local-overrides-brand badge */
9531
- .creator-shadow-badge {
9532
- font-size: 0.625rem;
9533
- font-weight: 600;
9534
- padding: 2px 0.4375rem;
9535
- border-radius: 10px;
9536
- background: rgba(168, 85, 247, 0.1);
9537
- color: #8b5cf6;
9538
- border: 1px solid rgba(168, 85, 247, 0.3);
9539
- cursor: help;
9540
- }
9541
- [data-theme="dark"] .creator-shadow-badge {
9542
- background: rgba(139, 92, 246, 0.15);
9543
- color: #a78bfa;
9544
- border-color: rgba(139, 92, 246, 0.3);
9545
- }
9546
-
9547
- /* ── Publish / Update button ───────────────────────────────────────────── */
9548
- .creator-upload-wrap { position: relative; }
9549
-
9550
- .btn-creator-publish {
9551
- display: flex;
9552
- align-items: center;
9553
- gap: 0.3125rem;
9554
- padding: 0.375rem 0.75rem;
9555
- border-radius: 7px;
9556
- font-size: 0.75rem;
9557
- font-weight: 500;
9558
- cursor: pointer;
9559
- background: var(--color-accent-primary);
9560
- color: #fff;
9561
- border: none;
9562
- transition: background-color 0.2s, opacity 0.2s;
9563
- white-space: nowrap;
9564
- }
9565
- .btn-creator-publish:hover:not(:disabled) {
9566
- background: var(--color-accent-hover);
9567
- }
9568
- .btn-creator-publish:disabled {
9569
- opacity: 0.6;
9570
- cursor: not-allowed;
9571
- }
9572
- .btn-creator-publish[data-state="success"] { background: var(--color-success, #22c55e); }
9573
- .btn-creator-publish[data-state="error"] { background: var(--color-error, #ef4444); }
9574
-
9575
- /* Progress bar (reuse skill-upload-progress-* classes) */
9576
- .creator-upload-wrap .skill-upload-progress-wrap {
9577
- position: absolute;
9578
- bottom: -0.1875rem;
9579
- left: 0; right: 0;
9580
- height: 2px;
9581
- background: var(--color-border-primary);
9582
- border-radius: 1px;
9583
- overflow: hidden;
9584
- }
9585
- .creator-upload-wrap .skill-upload-progress-bar {
9586
- height: 100%;
9587
- background: var(--color-accent-primary);
9588
- border-radius: 1px;
9589
- transition: width 0.15s ease;
9590
- }
9591
- .creator-upload-wrap .skill-upload-progress-bar[data-state="success"] { background: var(--color-success, #22c55e); }
9592
- .creator-upload-wrap .skill-upload-progress-bar[data-state="error"] { background: var(--color-error, #ef4444); }
9593
-
9594
- /* Iterate button */
9595
- .btn-creator-iterate {
9596
- display: flex;
9597
- align-items: center;
9598
- gap: 0.3125rem;
9599
- padding: 0.375rem 0.75rem;
9600
- border-radius: 7px;
9601
- font-size: 0.75rem;
9602
- font-weight: 500;
9603
- cursor: pointer;
9604
- background: transparent;
9605
- color: var(--color-text-secondary);
9606
- border: 1px solid var(--color-border-primary);
9607
- transition: background-color 0.2s, color 0.2s, border-color 0.2s;
9608
- white-space: nowrap;
9609
- }
9610
- .btn-creator-iterate:hover {
9611
- background: var(--color-bg-hover);
9612
- color: var(--color-text-primary);
9613
- border-color: var(--color-border-secondary);
9614
- }
9615
-
9616
- /* Up-to-date (disabled) button */
9617
- .btn-creator-up-to-date {
9618
- display: flex;
9619
- align-items: center;
9620
- gap: 0.3125rem;
9621
- padding: 0.375rem 0.75rem;
9622
- border-radius: 7px;
9623
- font-size: 0.75rem;
9624
- font-weight: 500;
9625
- cursor: not-allowed;
9626
- background: transparent;
9627
- color: var(--color-text-disabled, var(--color-text-muted));
9628
- border: 1px solid var(--color-border-muted, var(--color-border-primary));
9629
- opacity: 0.55;
9630
- white-space: nowrap;
9631
- }
9632
-
9633
- /* ── Promo banner (non-licensed users) ─────────────────────────────────── */
9634
- #creator-promo-banner {
9635
- display: flex;
9636
- align-items: center;
9637
- gap: 0.5rem;
9638
- padding: 0.625rem 0.875rem;
9639
- background: var(--color-bg-secondary);
9640
- border: 1px solid var(--color-border-primary);
9641
- border-radius: 8px;
9642
- font-size: 0.7812rem;
9643
- color: var(--color-text-secondary);
9644
- }
9645
- #creator-promo-banner svg {
9646
- flex-shrink: 0;
9647
- color: var(--color-accent-primary);
9648
- opacity: 0.8;
9649
- }
9650
- #creator-promo-banner a {
9651
- margin-left: auto;
9652
- white-space: nowrap;
9653
- color: var(--color-accent-primary);
9654
- text-decoration: none;
9655
- font-weight: 500;
9656
- }
9657
- #creator-promo-banner a:hover {
9658
- text-decoration: underline;
9659
- }
9660
-
9661
- /* ── Cloud skills lock (non-licensed users) ─────────────────────────────── */
9662
- #creator-cloud-lock {
9663
- display: flex;
9664
- align-items: center;
9665
- gap: 0.5rem;
9666
- padding: 0.75rem 0.875rem;
9667
- border: 1px dashed var(--color-border-primary);
9668
- border-radius: 8px;
9669
- font-size: 0.7812rem;
9670
- color: var(--color-text-muted);
9671
- }
9672
- #creator-cloud-lock svg {
9673
- flex-shrink: 0;
9674
- opacity: 0.5;
9675
- }
9676
- #creator-cloud-lock a {
9677
- margin-left: auto;
9678
- white-space: nowrap;
9679
- color: var(--color-accent-primary);
9680
- text-decoration: none;
9681
- font-weight: 500;
9682
- opacity: 0.85;
9683
- }
9684
- #creator-cloud-lock a:hover {
9685
- text-decoration: underline;
9686
- }
9687
-
9688
- /* ── Create New Skill entry card ───────────────────────────────────────── */
9689
- .creator-new-card {
9690
- display: flex;
9691
- align-items: center;
9692
- gap: 0.625rem;
9693
- padding: 0.875rem 1rem;
9694
- background: var(--color-bg-secondary);
9695
- border: 1px dashed var(--color-border-primary);
9696
- border-radius: 8px;
9697
- cursor: pointer;
9698
- font-size: 0.8125rem;
9699
- font-weight: 500;
9700
- color: var(--color-text-secondary);
9701
- transition: border-color .15s, color .15s, background .15s;
9702
- }
9703
- .creator-new-card:hover {
9704
- border-color: var(--color-accent-primary);
9705
- color: var(--color-accent-primary);
9706
- background: var(--color-accent-bg, rgba(59,130,246,0.04));
9707
- }
9708
- .creator-new-arrow {
9709
- margin-left: auto;
9710
- opacity: 0.5;
9711
- transition: opacity .15s, transform .15s;
9712
- }
9713
- .creator-new-card:hover .creator-new-arrow {
9714
- opacity: 1;
9715
- transform: translateX(3px);
9716
- }
9717
-
9718
- /* ── State messages ────────────────────────────────────────────────────── */
9719
- .creator-loading,
9720
- .creator-empty {
9721
- text-align: center;
9722
- color: var(--color-text-tertiary);
9723
- font-size: 0.8125rem;
9724
- padding: 1.5rem 0;
9725
- }
9726
- .creator-error {
9844
+ .trash-error {
9727
9845
  text-align: center;
9728
9846
  color: var(--color-error, #ef4444);
9729
9847
  font-size: 0.8125rem;
9730
9848
  padding: 1.5rem 0;
9731
9849
  }
9732
- .creator-notice {
9733
- font-size: 0.75rem;
9734
- padding: 0.5rem 0.75rem;
9735
- border-radius: 6px;
9736
- margin-bottom: 0.25rem;
9737
- }
9738
- .creator-notice-warn {
9739
- background: rgba(250, 173, 20, 0.1);
9740
- color: #b8860b;
9741
- border: 1px solid rgba(250, 173, 20, 0.3);
9742
- }
9743
- [data-theme="dark"] .creator-notice-warn { color: #f5c842; }
9744
-
9745
- /* ── Trash panel · Recently Deleted ────────────────────────────────── */
9746
9850
 
9747
9851
  /* Tab switches (file trash / session trash) — mirrors skills-tabs pattern */
9748
9852
  #trash-tabs {
@@ -9750,7 +9854,7 @@ body.setup-mode[data-theme="dark"] {
9750
9854
  align-items: center;
9751
9855
  justify-content: space-between;
9752
9856
  border-bottom: 1px solid var(--color-border-primary);
9753
- margin-bottom: 0.75rem;
9857
+ margin-bottom: 0.25rem;
9754
9858
  }
9755
9859
  .trash-tabs-left {
9756
9860
  display: flex;
@@ -9855,11 +9959,68 @@ body.setup-mode[data-theme="dark"] {
9855
9959
  opacity: .5;
9856
9960
  cursor: not-allowed;
9857
9961
  }
9962
+
9963
+ /* Skeleton card wrapper — uses global .skel for lines + animation */
9964
+ .trash-session-skeleton {
9965
+ background: var(--color-bg-secondary);
9966
+ border: 1px solid var(--color-border-primary);
9967
+ border-radius: 10px;
9968
+ padding: 0.75rem 1rem;
9969
+ display: flex;
9970
+ align-items: center;
9971
+ gap: 0.75rem;
9972
+ }
9973
+ .trash-session-skeleton-info {
9974
+ flex: 1;
9975
+ min-width: 0;
9976
+ display: flex;
9977
+ flex-direction: column;
9978
+ gap: 0.375rem;
9979
+ }
9980
+ .trash-skeleton-actions {
9981
+ display: flex;
9982
+ gap: 0.375rem;
9983
+ flex-shrink: 0;
9984
+ }
9985
+ .trash-skeleton-btn {
9986
+ width: 3.5rem;
9987
+ height: 1.625rem;
9988
+ border-radius: 5px;
9989
+ }
9990
+ .trash-session-hint {
9991
+ margin: -0.25rem 0;
9992
+ font-size: 0.75rem;
9993
+ color: var(--color-text-secondary);
9994
+ }
9858
9995
  .trash-summary {
9859
9996
  font-size: 0.6875rem;
9860
9997
  color: var(--color-text-muted);
9861
9998
  margin-right: auto;
9862
9999
  }
10000
+ .trash-filter-bar {
10001
+ display: flex;
10002
+ align-items: center;
10003
+ gap: 0.375rem;
10004
+ }
10005
+ .trash-filter-chip {
10006
+ font-size: 0.6875rem;
10007
+ padding: 0.2rem 0.55rem;
10008
+ border-radius: 5px;
10009
+ border: 1px solid var(--color-border-primary);
10010
+ background: transparent;
10011
+ color: var(--color-text-muted);
10012
+ cursor: pointer;
10013
+ transition: background 0.14s, color 0.14s, border-color 0.14s;
10014
+ }
10015
+ .trash-filter-chip:hover {
10016
+ border-color: var(--color-accent-primary);
10017
+ color: var(--color-text-primary);
10018
+ }
10019
+ .trash-filter-chip.active {
10020
+ background: var(--color-accent-primary);
10021
+ border-color: var(--color-accent-primary);
10022
+ color: #fff;
10023
+ }
9863
10024
  .trash-actions {
9864
10025
  display: flex;
9865
10026
  align-items: center;
@@ -11581,16 +11742,16 @@ body.setup-mode[data-theme="dark"] {
11581
11742
  .share-modal {
11582
11743
  position: relative;
11583
11744
  width: 100%;
11584
- max-width: 660px;
11745
+ max-width: 780px;
11585
11746
  max-height: 90vh;
11586
11747
  overflow-y: auto;
11587
11748
  background: var(--color-bg-card);
11588
11749
  border: 1px solid var(--color-border-primary);
11589
11750
  border-radius: var(--radius-lg, 14px);
11590
- box-shadow: 0 18px 48px rgba(15, 18, 28, 0.22);
11591
- padding: 24px;
11592
- transform: translateY(8px) scale(.98);
11593
- transition: transform .18s ease;
11751
+ box-shadow: 0 24px 64px rgba(15, 18, 28, 0.28);
11752
+ padding: 28px;
11753
+ transform: translateY(10px) scale(.97);
11754
+ transition: transform .22s ease;
11594
11755
  }
11595
11756
  .share-overlay.open .share-modal { transform: translateY(0) scale(1); }
11596
11757
 
@@ -11604,59 +11765,81 @@ body.setup-mode[data-theme="dark"] {
11604
11765
  line-height: 1;
11605
11766
  color: var(--color-text-muted);
11606
11767
  cursor: pointer;
11768
+ width: 32px;
11769
+ height: 32px;
11770
+ border-radius: 8px;
11771
+ display: flex;
11772
+ align-items: center;
11773
+ justify-content: center;
11774
+ transition: background 0.15s ease, color 0.15s ease;
11775
+ }
11776
+ .share-close:hover {
11777
+ color: var(--color-text-primary);
11778
+ background: var(--color-bg-hover, rgba(0,0,0,0.07));
11607
11779
  }
11608
- .share-close:hover { color: var(--color-text-primary); }
11609
11780
 
11610
11781
  .share-title {
11611
11782
  margin: 0 0 4px;
11612
- font-size: 1.0625rem;
11783
+ font-size: 1.125rem;
11613
11784
  font-weight: 700;
11614
11785
  color: var(--color-text-primary);
11615
11786
  }
11616
11787
  .share-subtitle {
11617
- margin: 0 0 16px;
11788
+ margin: 0 0 20px;
11618
11789
  font-size: 0.8125rem;
11619
11790
  color: var(--color-text-tertiary);
11620
11791
  }
11621
11792
 
11622
11793
  .share-body {
11623
11794
  display: flex;
11624
- gap: 20px;
11625
- align-items: flex-start;
11795
+ gap: 24px;
11796
+ align-items: stretch;
11626
11797
  }
11627
11798
  .share-controls {
11628
11799
  flex: 1;
11629
11800
  min-width: 0;
11801
+ display: flex;
11802
+ flex-direction: column;
11803
+ }
11804
+ .share-actions {
11805
+ margin-top: auto;
11630
11806
  }
11631
11807
 
11632
11808
  .share-poster-wrap {
11633
- display: flex;
11634
- justify-content: center;
11635
11809
  flex-shrink: 0;
11810
+ display: flex;
11636
11811
  }
11637
11812
  .share-poster-img {
11638
- width: 220px;
11813
+ width: 250px;
11814
+ object-fit: cover;
11639
11815
  border-radius: var(--radius-md, 10px);
11640
- box-shadow: 0 6px 18px rgba(15, 18, 28, 0.16);
11816
+ box-shadow: 0 8px 28px rgba(15, 18, 28, 0.22);
11817
+ cursor: pointer;
11818
+ transition: box-shadow .2s ease;
11819
+ }
11820
+ .share-poster-img:hover {
11821
+ box-shadow: 0 12px 36px rgba(15, 18, 28, 0.3);
11641
11822
  }
11642
11823
 
11643
- @media (max-width: 560px) {
11824
+ @media (max-width: 620px) {
11644
11825
  .share-body { flex-direction: column; align-items: stretch; }
11645
11826
  .share-poster-wrap { margin-bottom: 4px; }
11646
- .share-poster-img { width: 180px; }
11827
+ .share-poster-img { width: 100%; height: 200px; }
11647
11828
  }
11648
11829
 
11649
11830
  .share-row-label {
11650
- font-size: 0.75rem;
11831
+ font-size: 0.6875rem;
11651
11832
  font-weight: 600;
11652
- color: var(--color-text-tertiary);
11833
+ letter-spacing: .04em;
11834
+ text-transform: uppercase;
11835
+ color: var(--color-text-muted);
11653
11836
  }
11654
11837
 
11655
11838
  .share-theme-row {
11656
11839
  display: flex;
11657
11840
  flex-direction: column;
11658
- gap: 6px;
11659
- margin-bottom: 14px;
11841
+ gap: 8px;
11842
+ margin-bottom: 16px;
11660
11843
  }
11661
11844
  .share-theme-chips {
11662
11845
  display: flex;
@@ -11664,29 +11847,46 @@ body.setup-mode[data-theme="dark"] {
11664
11847
  }
11665
11848
  .share-theme-chip {
11666
11849
  flex: 1;
11667
- height: 34px;
11850
+ height: 40px;
11668
11851
  border: 2px solid transparent;
11669
- border-radius: var(--radius-sm, 6px);
11852
+ border-radius: var(--radius-sm, 8px);
11670
11853
  cursor: pointer;
11671
11854
  position: relative;
11672
11855
  display: flex;
11673
11856
  align-items: center;
11674
11857
  justify-content: center;
11675
- transition: border-color .12s ease, transform .12s ease;
11858
+ gap: 6px;
11859
+ transition: border-color .14s ease, transform .14s ease, box-shadow .14s ease;
11860
+ box-shadow: 0 2px 6px rgba(0,0,0,.08);
11861
+ }
11862
+ .share-theme-chip:hover { transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,.14); }
11863
+ .share-theme-chip.is-active {
11864
+ border-color: var(--color-button-primary);
11865
+ box-shadow: 0 0 0 3px rgba(var(--color-button-primary-rgb, 124,58,237), .18);
11676
11866
  }
11677
- .share-theme-chip:hover { transform: translateY(-1px); }
11678
- .share-theme-chip.is-active { border-color: var(--color-button-primary); }
11679
11867
  .share-theme-name {
11680
11868
  font-size: 0.6875rem;
11681
11869
  font-weight: 700;
11682
- color: rgba(0,0,0,.55);
11683
- text-shadow: 0 1px 0 rgba(255,255,255,.4);
11684
11870
  pointer-events: none;
11685
11871
  }
11872
+ .share-theme-dot {
11873
+ width: 8px;
11874
+ height: 8px;
11875
+ border-radius: 50%;
11876
+ flex-shrink: 0;
11877
+ pointer-events: none;
11878
+ box-shadow: 0 0 0 1.5px rgba(255,255,255,.3);
11879
+ }
11686
11880
  .share-theme-chip[data-theme="geek"] .share-theme-name {
11687
11881
  color: rgba(255,255,255,.92);
11688
11882
  text-shadow: 0 1px 2px rgba(0,0,0,.4);
11689
11883
  }
11884
+ .share-theme-chip[data-theme="light"] .share-theme-name {
11885
+ color: rgba(15,23,42,.72);
11886
+ }
11887
+ .share-theme-chip[data-theme="warm"] .share-theme-name {
11888
+ color: rgba(124,45,18,.85);
11889
+ }
11690
11890
 
11691
11891
  .share-periods {
11692
11892
  display: inline-flex;
@@ -11718,7 +11918,7 @@ body.setup-mode[data-theme="dark"] {
11718
11918
  display: grid;
11719
11919
  grid-template-columns: repeat(4, 1fr);
11720
11920
  gap: 8px;
11721
- margin-bottom: 14px;
11921
+ margin-bottom: 16px;
11722
11922
  }
11723
11923
  .share-platform {
11724
11924
  padding: 9px 4px;
@@ -11726,22 +11926,31 @@ body.setup-mode[data-theme="dark"] {
11726
11926
  border-radius: var(--radius-sm, 6px);
11727
11927
  background: var(--color-bg-primary);
11728
11928
  color: var(--color-text-secondary);
11729
- font-size: 0.8125rem;
11929
+ font-size: 0.75rem;
11730
11930
  font-weight: 600;
11731
11931
  cursor: pointer;
11732
- transition: background .12s ease, border-color .12s ease, color .12s ease;
11932
+ display: flex;
11933
+ flex-direction: column;
11934
+ align-items: center;
11935
+ gap: 4px;
11936
+ transition: background .12s ease, border-color .12s ease, color .12s ease, transform .12s ease;
11733
11937
  }
11734
11938
  .share-platform:hover {
11735
11939
  background: var(--color-bg-hover);
11736
11940
  border-color: var(--color-border-strong);
11941
+ transform: translateY(-1px);
11737
11942
  }
11738
11943
  .share-platform.is-active {
11739
11944
  background: var(--color-button-primary);
11740
11945
  color: var(--color-button-primary-text);
11741
11946
  border-color: var(--color-button-primary);
11742
11947
  }
11948
+ .share-platform-icon {
11949
+ font-size: 1.125rem;
11950
+ line-height: 1;
11951
+ }
11743
11952
 
11744
- .share-editor { margin-bottom: 14px; }
11953
+ .share-editor { margin-bottom: 16px; }
11745
11954
  .share-editor-head {
11746
11955
  display: flex;
11747
11956
  align-items: center;
@@ -11756,25 +11965,29 @@ body.setup-mode[data-theme="dark"] {
11756
11965
  font-weight: 600;
11757
11966
  cursor: pointer;
11758
11967
  padding: 2px 4px;
11968
+ border-radius: 4px;
11969
+ transition: background .1s ease;
11759
11970
  }
11760
- .share-shuffle:hover { text-decoration: underline; }
11971
+ .share-shuffle:hover { background: var(--color-bg-hover); }
11761
11972
  .share-text {
11762
11973
  width: 100%;
11763
11974
  box-sizing: border-box;
11764
11975
  resize: vertical;
11765
- min-height: 72px;
11976
+ min-height: 80px;
11766
11977
  padding: 10px 12px;
11767
11978
  border: 1px solid var(--color-border-primary);
11768
11979
  border-radius: var(--radius-sm, 6px);
11769
11980
  background: var(--color-bg-primary);
11770
11981
  color: var(--color-text-primary);
11771
11982
  font-size: 0.8125rem;
11772
- line-height: 1.5;
11983
+ line-height: 1.6;
11773
11984
  font-family: inherit;
11985
+ transition: border-color .12s ease;
11774
11986
  }
11775
11987
  .share-text:focus {
11776
11988
  outline: none;
11777
11989
  border-color: var(--color-button-primary);
11990
+ box-shadow: 0 0 0 2px rgba(var(--color-button-primary-rgb, 124,58,237), .12);
11778
11991
  }
11779
11992
 
11780
11993
  .share-actions {
@@ -11782,28 +11995,44 @@ body.setup-mode[data-theme="dark"] {
11782
11995
  flex-wrap: wrap;
11783
11996
  gap: 8px;
11784
11997
  }
11785
- .share-btn-primary, .share-btn-secondary {
11786
- padding: 10px;
11787
- border-radius: var(--radius-sm, 6px);
11788
- font-size: 0.8125rem;
11789
- font-weight: 600;
11790
- cursor: pointer;
11791
- border: 1px solid var(--color-border-primary);
11792
- }
11793
11998
  .share-btn-primary {
11794
11999
  flex: 1 1 100%;
12000
+ padding: 12px 16px;
12001
+ border-radius: var(--radius-sm, 8px);
12002
+ font-size: 0.9375rem;
12003
+ font-weight: 700;
12004
+ cursor: pointer;
12005
+ border: none;
11795
12006
  background: var(--color-button-primary);
11796
12007
  color: var(--color-button-primary-text);
11797
- border-color: var(--color-button-primary);
12008
+ letter-spacing: .01em;
12009
+ transition: background .14s ease, transform .1s ease, box-shadow .14s ease;
12010
+ box-shadow: 0 2px 8px rgba(var(--color-button-primary-rgb, 124,58,237), .3);
12011
+ }
12012
+ .share-btn-primary:hover {
12013
+ background: var(--color-button-primary-hover);
12014
+ transform: translateY(-1px);
12015
+ box-shadow: 0 4px 14px rgba(var(--color-button-primary-rgb, 124,58,237), .4);
11798
12016
  }
11799
- .share-btn-primary:hover { background: var(--color-button-primary-hover); }
12017
+ .share-btn-primary:active { transform: translateY(0); }
11800
12018
  .share-btn-secondary {
11801
- flex: 1 1 calc(50% - 4px);
11802
- min-width: 90px;
12019
+ flex: 1 1 calc(33% - 6px);
12020
+ min-width: 80px;
12021
+ padding: 9px 8px;
12022
+ border-radius: var(--radius-sm, 6px);
12023
+ font-size: 0.8125rem;
12024
+ font-weight: 600;
12025
+ cursor: pointer;
12026
+ border: 1px solid var(--color-border-primary);
11803
12027
  background: var(--color-bg-primary);
11804
12028
  color: var(--color-text-secondary);
12029
+ transition: background .12s ease, border-color .12s ease, color .12s ease;
12030
+ }
12031
+ .share-btn-secondary:hover {
12032
+ background: var(--color-bg-hover);
12033
+ border-color: var(--color-border-strong);
12034
+ color: var(--color-text-primary);
11805
12035
  }
11806
- .share-btn-secondary:hover { background: var(--color-bg-hover); }
11807
12036
 
11808
12037
  #share-toggle-header svg { display: block; }
11809
12038
 
@@ -12083,10 +12312,9 @@ body.setup-mode[data-theme="dark"] {
12083
12312
  gap: 0.75rem;
12084
12313
  }
12085
12314
 
12086
- /* ── Billing / Trash / Creator pages ── */
12315
+ /* ── Billing / Trash pages ── */
12087
12316
  #billing-body { padding: 1rem 1rem 1rem; }
12088
12317
  #trash-body { padding: 1rem 1rem 1rem; }
12089
- #creator-body { padding: 1rem 1rem 1rem; }
12090
12318
 
12091
12319
  .billing-heatmap-row { grid-template-columns: 1fr; }
12092
12320