openclacky 1.3.6 → 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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/lib/clacky/agent.rb +8 -1
  4. data/lib/clacky/agent_profile.rb +121 -53
  5. data/lib/clacky/brand_config.rb +309 -6
  6. data/lib/clacky/cli.rb +4 -57
  7. data/lib/clacky/default_extensions/coding/ext.yml +18 -0
  8. data/lib/clacky/default_extensions/ext-studio/agents/ext-developer/system_prompt.md +95 -0
  9. data/lib/clacky/default_extensions/ext-studio/api/handler.rb +254 -0
  10. data/lib/clacky/default_extensions/ext-studio/ext.yml +32 -0
  11. data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +1269 -0
  12. data/lib/clacky/default_extensions/ext-studio/skills/ext-debug/SKILL.md +71 -0
  13. data/lib/clacky/default_extensions/ext-studio/skills/ext-publish/SKILL.md +74 -0
  14. data/lib/clacky/default_extensions/ext-studio/skills/ext-scaffold/SKILL.md +65 -0
  15. data/lib/clacky/default_extensions/general/ext.yml +18 -0
  16. data/lib/clacky/default_extensions/git/ext.yml +12 -0
  17. data/lib/clacky/{default_agents/_panels/git/panel.js → default_extensions/git/panels/git/view.js} +1 -2
  18. data/lib/clacky/default_extensions/meeting/{handler.rb → api/handler.rb} +78 -26
  19. data/lib/clacky/default_extensions/meeting/ext.yml +15 -0
  20. data/lib/clacky/default_extensions/meeting/{meeting.js → panels/meeting/view.js} +266 -89
  21. data/lib/clacky/default_extensions/meeting/skills/meeting-summarizer/SKILL.md +2 -1
  22. data/lib/clacky/default_extensions/time_machine/ext.yml +12 -0
  23. data/lib/clacky/{default_agents/_panels/time_machine/panel.js → default_extensions/time_machine/panels/time_machine/view.js} +58 -47
  24. data/lib/clacky/default_skills/channel-manager/discord_setup.rb +1 -1
  25. data/lib/clacky/default_skills/extend-openclacky/SKILL.md +83 -18
  26. data/lib/clacky/{api_extension.rb → extension/api_extension.rb} +27 -11
  27. data/lib/clacky/extension/api_loader.rb +136 -0
  28. data/lib/clacky/extension/cli_commands.rb +226 -0
  29. data/lib/clacky/{server/api_extension_dispatcher.rb → extension/dispatcher.rb} +22 -9
  30. data/lib/clacky/extension/hook_loader.rb +77 -0
  31. data/lib/clacky/extension/loader.rb +483 -0
  32. data/lib/clacky/extension/packager.rb +226 -0
  33. data/lib/clacky/{patch_loader.rb → extension/patch_loader.rb} +45 -0
  34. data/lib/clacky/extension/scaffold/template_renderer.rb +64 -0
  35. data/lib/clacky/extension/scaffold/templates/full/README.md.erb +48 -0
  36. data/lib/clacky/extension/scaffold/templates/full/agents/designer.md +5 -0
  37. data/lib/clacky/extension/scaffold/templates/full/api/handler.rb.erb +16 -0
  38. data/lib/clacky/extension/scaffold/templates/full/channels/noop.rb.erb +40 -0
  39. data/lib/clacky/extension/scaffold/templates/full/ext.yml.erb +41 -0
  40. data/lib/clacky/extension/scaffold/templates/full/hooks/audit.rb +9 -0
  41. data/lib/clacky/extension/scaffold/templates/full/panels/dashboard/view.js.erb +194 -0
  42. data/lib/clacky/extension/scaffold/templates/full/patches/audit.rb +15 -0
  43. data/lib/clacky/extension/scaffold/templates/full/skills/__slug__-skill/SKILL.md.erb +8 -0
  44. data/lib/clacky/extension/scaffold/templates/hello/api/handler.rb.erb +9 -0
  45. data/lib/clacky/extension/scaffold/templates/hello/ext.yml.erb +12 -0
  46. data/lib/clacky/extension/scaffold/templates/hello/panels/hello/view.js.erb +31 -0
  47. data/lib/clacky/extension/scaffold.rb +55 -0
  48. data/lib/clacky/extension/verifier.rb +196 -0
  49. data/lib/clacky/identity.rb +70 -0
  50. data/lib/clacky/locales/en.rb +19 -1
  51. data/lib/clacky/locales/zh.rb +19 -1
  52. data/lib/clacky/platform_http_client.rb +18 -15
  53. data/lib/clacky/server/channel/extension_adapter_loader.rb +32 -0
  54. data/lib/clacky/server/channel.rb +6 -0
  55. data/lib/clacky/server/http_server.rb +313 -144
  56. data/lib/clacky/server/session_registry.rb +9 -2
  57. data/lib/clacky/skill_loader.rb +28 -1
  58. data/lib/clacky/ui2/ui_controller.rb +9 -6
  59. data/lib/clacky/version.rb +1 -1
  60. data/lib/clacky/web/app.css +748 -573
  61. data/lib/clacky/web/app.js +63 -15
  62. data/lib/clacky/web/auth.js +2 -0
  63. data/lib/clacky/web/components/notify.js +2 -0
  64. data/lib/clacky/web/components/sidebar.js +1 -5
  65. data/lib/clacky/web/core/ext.js +316 -79
  66. data/lib/clacky/web/features/backup/store.js +1 -0
  67. data/lib/clacky/web/features/backup/view.js +0 -1
  68. data/lib/clacky/web/features/brand/view.js +13 -5
  69. data/lib/clacky/web/features/extensions/store.js +184 -0
  70. data/lib/clacky/web/features/extensions/view.js +389 -0
  71. data/lib/clacky/web/features/new-session/store.js +186 -0
  72. data/lib/clacky/web/features/new-session/view.js +319 -0
  73. data/lib/clacky/web/features/share/view.js +63 -14
  74. data/lib/clacky/web/features/skills/store.js +3 -1
  75. data/lib/clacky/web/features/skills/view.js +1 -1
  76. data/lib/clacky/web/features/tasks/view.js +12 -0
  77. data/lib/clacky/web/features/trash/store.js +24 -6
  78. data/lib/clacky/web/features/trash/view.js +46 -9
  79. data/lib/clacky/web/features/workspace/store.js +2 -0
  80. data/lib/clacky/web/features/workspace/view.js +0 -1
  81. data/lib/clacky/web/i18n.js +118 -106
  82. data/lib/clacky/web/index.html +138 -188
  83. data/lib/clacky/web/sessions.js +64 -269
  84. data/lib/clacky/web/settings.js +1 -1
  85. data/lib/clacky/web/skills.js +2 -0
  86. data/lib/clacky/web/theme.js +2 -0
  87. data/lib/clacky/web/ws-dispatcher.js +1 -0
  88. data/lib/clacky/web/ws.js +2 -0
  89. data/lib/clacky.rb +21 -10
  90. metadata +55 -24
  91. data/benchmark/runner.rb +0 -441
  92. data/lib/clacky/api_extension_loader.rb +0 -168
  93. data/lib/clacky/default_agents/SOUL.md +0 -3
  94. data/lib/clacky/default_agents/USER.md +0 -1
  95. data/lib/clacky/default_agents/coding/profile.yml +0 -5
  96. data/lib/clacky/default_agents/coding/webui/.gitkeep +0 -0
  97. data/lib/clacky/default_agents/general/profile.yml +0 -2
  98. data/lib/clacky/default_extensions/meeting/meta.yml +0 -3
  99. data/lib/clacky/web/features/creator/store.js +0 -81
  100. data/lib/clacky/web/features/creator/view.js +0 -380
  101. /data/lib/clacky/{default_agents → default_extensions/coding/agents}/coding/system_prompt.md +0 -0
  102. /data/lib/clacky/{default_agents → default_extensions/general/agents}/general/system_prompt.md +0 -0
  103. /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 ──────────────────────────────────────────────────────────── */
@@ -5780,24 +5966,7 @@ body {
5780
5966
  border-color: var(--color-accent-primary);
5781
5967
  }
5782
5968
 
5783
- /* New Session Modal */
5784
- .new-session-modal {
5785
- max-width: 32.5rem;
5786
- padding: 1.25rem 1.25rem 1rem;
5787
- }
5788
- .new-session-modal .modal-header {
5789
- display: flex;
5790
- align-items: center;
5791
- margin-bottom: 0.875rem;
5792
- }
5793
- .new-session-modal .modal-title {
5794
- font-size: 1rem;
5795
- font-weight: 600;
5796
- margin: 0;
5797
- padding: 0;
5798
- border: none;
5799
- color: var(--color-text-primary);
5800
- }
5969
+
5801
5970
  .modal-box .modal-header {
5802
5971
  display: flex;
5803
5972
  align-items: center;
@@ -5922,13 +6091,6 @@ body {
5922
6091
  cursor: pointer;
5923
6092
  accent-color: var(--color-accent-primary);
5924
6093
  }
5925
- .new-session-modal .modal-body {
5926
- gap: 0.75rem;
5927
- }
5928
- .new-session-modal .modal-footer {
5929
- margin-top: 1rem;
5930
- padding-top: 1rem;
5931
- }
5932
6094
  .modal-footer {
5933
6095
  display: flex;
5934
6096
  gap: 0.625rem;
@@ -6287,7 +6449,7 @@ body {
6287
6449
  transition: transform 0.18s;
6288
6450
  }
6289
6451
  .skills-filter-toggle input:checked ~ .skills-filter-toggle-track {
6290
- background: var(--color-accent, #6c63ff);
6452
+ background: var(--color-accent-primary);
6291
6453
  }
6292
6454
  .skills-filter-toggle input:checked ~ .skills-filter-toggle-track::after {
6293
6455
  transform: translateX(0.875rem);
@@ -6310,7 +6472,7 @@ body {
6310
6472
  color: var(--color-text-secondary);
6311
6473
  font-size: 0.8125rem;
6312
6474
  }
6313
- /* Guided CTA card in the empty-skills state — mirrors .creator-new-card */
6475
+ /* Guided CTA card in the empty-skills state */
6314
6476
  .skills-empty-create-btn {
6315
6477
  display: flex;
6316
6478
  align-items: center;
@@ -6777,6 +6939,240 @@ body {
6777
6939
  margin-bottom: 0.625rem;
6778
6940
  }
6779
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
+
6780
7176
  /* Brand Skill card */
6781
7177
  .brand-skill-card {
6782
7178
  background: var(--color-bg-secondary);
@@ -8184,6 +8580,8 @@ body.setup-mode[data-theme="dark"] {
8184
8580
  flex-shrink: 0;
8185
8581
  }
8186
8582
 
8583
+ .brand-warning-bar > span { flex: 1; }
8584
+
8187
8585
  .brand-warning-bar button {
8188
8586
  background: transparent;
8189
8587
  border: none;
@@ -8194,6 +8592,20 @@ body.setup-mode[data-theme="dark"] {
8194
8592
  opacity: 0.7;
8195
8593
  }
8196
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
+
8197
8609
  .brand-warning-bar button:hover { opacity: 1; }
8198
8610
 
8199
8611
  /* ── Brand activation banner (top info bar, replaces full-screen panel) ──── */
@@ -9420,418 +9832,57 @@ body.setup-mode[data-theme="dark"] {
9420
9832
 
9421
9833
  /* ── Mobile responsive (≤48rem) ─────────────────────────────────────────── */
9422
9834
 
9835
+ /* ── Trash panel · Recently Deleted ────────────────────────────────── */
9423
9836
 
9424
- /* ══════════════════════════════════════════════════════════════════════════
9425
- Creator Hub — Creator Center
9426
- ══════════════════════════════════════════════════════════════════════════ */
9427
-
9428
- #creator-panel {
9429
- display: flex;
9430
- flex-direction: column;
9431
- height: 100%;
9432
- 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;
9433
9843
  }
9434
-
9435
- #creator-body {
9436
- flex: 1;
9437
- overflow-y: auto;
9438
- display: flex;
9439
- flex-direction: column;
9440
- padding: 2rem 2rem 3.75rem;
9441
- gap: 1.75rem;
9844
+ .trash-error {
9845
+ text-align: center;
9846
+ color: var(--color-error, #ef4444);
9847
+ font-size: 0.8125rem;
9848
+ padding: 1.5rem 0;
9442
9849
  }
9443
9850
 
9444
- /* ── Section blocks ────────────────────────────────────────────────────── */
9445
- .creator-section-block {
9851
+ /* Tab switches (file trash / session trash) — mirrors skills-tabs pattern */
9852
+ #trash-tabs {
9446
9853
  display: flex;
9447
- flex-direction: column;
9448
- gap: 0.625rem;
9854
+ align-items: center;
9855
+ justify-content: space-between;
9856
+ border-bottom: 1px solid var(--color-border-primary);
9857
+ margin-bottom: 0.25rem;
9449
9858
  }
9450
-
9451
- .creator-section-header {
9859
+ .trash-tabs-left {
9452
9860
  display: flex;
9453
- align-items: baseline;
9454
- gap: 0.625rem;
9455
- padding-bottom: 0.375rem;
9456
- border-bottom: 1px solid var(--color-border-primary);
9457
- margin-bottom: 2px;
9861
+ align-items: center;
9862
+ gap: 0.25rem;
9458
9863
  }
9459
-
9460
- .creator-section-label {
9461
- font-size: 0.75rem;
9462
- font-weight: 600;
9864
+ .trash-tab {
9865
+ background: none;
9866
+ border: none;
9867
+ border-bottom: 2px solid transparent;
9463
9868
  color: var(--color-text-secondary);
9464
- text-transform: uppercase;
9465
- letter-spacing: 0.5px;
9466
- }
9467
-
9468
- .creator-section-hint {
9469
- font-size: 0.6875rem;
9470
- color: var(--color-text-muted);
9869
+ cursor: pointer;
9870
+ font-size: 0.8125rem;
9871
+ font-weight: 500;
9872
+ padding: 0.5rem 1rem;
9873
+ margin-bottom: -1px;
9874
+ transition: color .15s, border-color .15s;
9471
9875
  }
9876
+ .trash-tab:hover { color: var(--color-text-primary); }
9877
+ .trash-tab.active { color: var(--color-accent-primary); border-bottom-color: var(--color-accent-primary); }
9472
9878
 
9473
- .creator-list {
9474
- display: flex;
9475
- flex-direction: column;
9476
- gap: 0.5rem;
9879
+ .trash-tab-content {
9880
+ flex: 1;
9881
+ overflow-y: auto;
9477
9882
  }
9478
9883
 
9479
- /* ── Skill Card base ───────────────────────────────────────────────────── */
9480
- .creator-skill-card {
9481
- background: var(--color-bg-secondary);
9482
- border: 1px solid var(--color-border-primary);
9483
- border-radius: 8px;
9484
- padding: 0.875rem 1rem;
9485
- margin-bottom: 0.75rem;
9486
- transition: border-color .15s;
9487
- }
9488
- .creator-skill-card:last-child {
9489
- margin-bottom: 0;
9490
- }
9491
- .creator-skill-card:hover { border-color: var(--color-text-muted); }
9492
-
9493
- .creator-card-main {
9494
- display: flex;
9495
- align-items: center;
9496
- gap: 0.75rem;
9497
- }
9498
- .creator-card-info { flex: 1; min-width: 0; }
9499
- .creator-card-actions {
9500
- display: flex;
9501
- align-items: center;
9502
- gap: 0.5rem;
9503
- flex-shrink: 0;
9504
- }
9505
- .creator-card-title {
9506
- display: flex;
9507
- align-items: center;
9508
- gap: 0.5rem;
9509
- margin-bottom: 0.25rem;
9510
- flex-wrap: wrap;
9511
- }
9512
- .creator-skill-name {
9513
- font-size: 0.8125rem;
9514
- font-weight: 600;
9515
- color: var(--color-text-primary);
9516
- }
9517
- .creator-card-desc {
9518
- font-size: 0.75rem;
9519
- color: var(--color-text-tertiary);
9520
- line-height: 1.5;
9521
- white-space: nowrap;
9522
- overflow: hidden;
9523
- text-overflow: ellipsis;
9524
- }
9525
-
9526
- /* ── Card meta row (version + download count) ──────────────────────────── */
9527
- .creator-card-meta {
9528
- display: flex;
9529
- align-items: center;
9530
- gap: 0.75rem;
9531
- margin-top: 0.3125rem;
9532
- }
9533
-
9534
- .creator-version {
9535
- font-size: 0.6875rem;
9536
- color: var(--color-text-muted);
9537
- }
9538
-
9539
- .creator-dl-count {
9540
- display: inline-flex;
9541
- align-items: center;
9542
- gap: 0.25rem;
9543
- font-size: 0.6875rem;
9544
- color: var(--color-text-muted);
9545
- }
9546
-
9547
- /* ── Badges ────────────────────────────────────────────────────────────── */
9548
- .creator-badge {
9549
- font-size: 0.625rem;
9550
- font-weight: 600;
9551
- padding: 2px 0.4375rem;
9552
- border-radius: 10px;
9553
- letter-spacing: 0.3px;
9554
- flex-shrink: 0;
9555
- }
9556
- .creator-badge-published {
9557
- background: var(--color-success-bg);
9558
- color: var(--color-success);
9559
- border: 1px solid var(--color-success-border);
9560
- }
9561
- .creator-badge-local {
9562
- background: rgba(250, 173, 20, 0.1);
9563
- color: #b8860b;
9564
- border: 1px solid rgba(250, 173, 20, 0.3);
9565
- }
9566
- [data-theme="dark"] .creator-badge-local {
9567
- color: #f5c842;
9568
- background: rgba(245, 200, 66, 0.1);
9569
- border-color: rgba(245, 200, 66, 0.25);
9570
- }
9571
-
9572
- /* "Has local changes" badge — orange dot */
9573
- .creator-changes-badge {
9574
- font-size: 0.6875rem;
9575
- font-weight: 500;
9576
- color: #d97706;
9577
- flex-shrink: 0;
9578
- }
9579
- [data-theme="dark"] .creator-changes-badge {
9580
- color: #fbbf24;
9581
- }
9582
-
9583
- /* Local-overrides-brand badge */
9584
- .creator-shadow-badge {
9585
- font-size: 0.625rem;
9586
- font-weight: 600;
9587
- padding: 2px 0.4375rem;
9588
- border-radius: 10px;
9589
- background: rgba(168, 85, 247, 0.1);
9590
- color: #8b5cf6;
9591
- border: 1px solid rgba(168, 85, 247, 0.3);
9592
- cursor: help;
9593
- }
9594
- [data-theme="dark"] .creator-shadow-badge {
9595
- background: rgba(139, 92, 246, 0.15);
9596
- color: #a78bfa;
9597
- border-color: rgba(139, 92, 246, 0.3);
9598
- }
9599
-
9600
- /* ── Publish / Update button ───────────────────────────────────────────── */
9601
- .creator-upload-wrap { position: relative; }
9602
-
9603
- .btn-creator-publish {
9604
- display: flex;
9605
- align-items: center;
9606
- gap: 0.3125rem;
9607
- padding: 0.375rem 0.75rem;
9608
- border-radius: 7px;
9609
- font-size: 0.75rem;
9610
- font-weight: 500;
9611
- cursor: pointer;
9612
- background: var(--color-accent-primary);
9613
- color: #fff;
9614
- border: none;
9615
- transition: background-color 0.2s, opacity 0.2s;
9616
- white-space: nowrap;
9617
- }
9618
- .btn-creator-publish:hover:not(:disabled) {
9619
- background: var(--color-accent-hover);
9620
- }
9621
- .btn-creator-publish:disabled {
9622
- opacity: 0.6;
9623
- cursor: not-allowed;
9624
- }
9625
- .btn-creator-publish[data-state="success"] { background: var(--color-success, #22c55e); }
9626
- .btn-creator-publish[data-state="error"] { background: var(--color-error, #ef4444); }
9627
-
9628
- /* Progress bar (reuse skill-upload-progress-* classes) */
9629
- .creator-upload-wrap .skill-upload-progress-wrap {
9630
- position: absolute;
9631
- bottom: -0.1875rem;
9632
- left: 0; right: 0;
9633
- height: 2px;
9634
- background: var(--color-border-primary);
9635
- border-radius: 1px;
9636
- overflow: hidden;
9637
- }
9638
- .creator-upload-wrap .skill-upload-progress-bar {
9639
- height: 100%;
9640
- background: var(--color-accent-primary);
9641
- border-radius: 1px;
9642
- transition: width 0.15s ease;
9643
- }
9644
- .creator-upload-wrap .skill-upload-progress-bar[data-state="success"] { background: var(--color-success, #22c55e); }
9645
- .creator-upload-wrap .skill-upload-progress-bar[data-state="error"] { background: var(--color-error, #ef4444); }
9646
-
9647
- /* Iterate button */
9648
- .btn-creator-iterate {
9649
- display: flex;
9650
- align-items: center;
9651
- gap: 0.3125rem;
9652
- padding: 0.375rem 0.75rem;
9653
- border-radius: 7px;
9654
- font-size: 0.75rem;
9655
- font-weight: 500;
9656
- cursor: pointer;
9657
- background: transparent;
9658
- color: var(--color-text-secondary);
9659
- border: 1px solid var(--color-border-primary);
9660
- transition: background-color 0.2s, color 0.2s, border-color 0.2s;
9661
- white-space: nowrap;
9662
- }
9663
- .btn-creator-iterate:hover {
9664
- background: var(--color-bg-hover);
9665
- color: var(--color-text-primary);
9666
- border-color: var(--color-border-secondary);
9667
- }
9668
-
9669
- /* Up-to-date (disabled) button */
9670
- .btn-creator-up-to-date {
9671
- display: flex;
9672
- align-items: center;
9673
- gap: 0.3125rem;
9674
- padding: 0.375rem 0.75rem;
9675
- border-radius: 7px;
9676
- font-size: 0.75rem;
9677
- font-weight: 500;
9678
- cursor: not-allowed;
9679
- background: transparent;
9680
- color: var(--color-text-disabled, var(--color-text-muted));
9681
- border: 1px solid var(--color-border-muted, var(--color-border-primary));
9682
- opacity: 0.55;
9683
- white-space: nowrap;
9684
- }
9685
-
9686
- /* ── Promo banner (non-licensed users) ─────────────────────────────────── */
9687
- #creator-promo-banner {
9688
- display: flex;
9689
- align-items: center;
9690
- gap: 0.5rem;
9691
- padding: 0.625rem 0.875rem;
9692
- background: var(--color-bg-secondary);
9693
- border: 1px solid var(--color-border-primary);
9694
- border-radius: 8px;
9695
- font-size: 0.7812rem;
9696
- color: var(--color-text-secondary);
9697
- }
9698
- #creator-promo-banner svg {
9699
- flex-shrink: 0;
9700
- color: var(--color-accent-primary);
9701
- opacity: 0.8;
9702
- }
9703
- #creator-promo-banner a {
9704
- margin-left: auto;
9705
- white-space: nowrap;
9706
- color: var(--color-accent-primary);
9707
- text-decoration: none;
9708
- font-weight: 500;
9709
- }
9710
- #creator-promo-banner a:hover {
9711
- text-decoration: underline;
9712
- }
9713
-
9714
- /* ── Cloud skills lock (non-licensed users) ─────────────────────────────── */
9715
- #creator-cloud-lock {
9716
- display: flex;
9717
- align-items: center;
9718
- gap: 0.5rem;
9719
- padding: 0.75rem 0.875rem;
9720
- border: 1px dashed var(--color-border-primary);
9721
- border-radius: 8px;
9722
- font-size: 0.7812rem;
9723
- color: var(--color-text-muted);
9724
- }
9725
- #creator-cloud-lock svg {
9726
- flex-shrink: 0;
9727
- opacity: 0.5;
9728
- }
9729
- #creator-cloud-lock a {
9730
- margin-left: auto;
9731
- white-space: nowrap;
9732
- color: var(--color-accent-primary);
9733
- text-decoration: none;
9734
- font-weight: 500;
9735
- opacity: 0.85;
9736
- }
9737
- #creator-cloud-lock a:hover {
9738
- text-decoration: underline;
9739
- }
9740
-
9741
- /* ── Create New Skill entry card ───────────────────────────────────────── */
9742
- .creator-new-card {
9743
- display: flex;
9744
- align-items: center;
9745
- gap: 0.625rem;
9746
- padding: 0.875rem 1rem;
9747
- background: var(--color-bg-secondary);
9748
- border: 1px dashed var(--color-border-primary);
9749
- border-radius: 8px;
9750
- cursor: pointer;
9751
- font-size: 0.8125rem;
9752
- font-weight: 500;
9753
- color: var(--color-text-secondary);
9754
- transition: border-color .15s, color .15s, background .15s;
9755
- }
9756
- .creator-new-card:hover {
9757
- border-color: var(--color-accent-primary);
9758
- color: var(--color-accent-primary);
9759
- background: var(--color-accent-bg, rgba(59,130,246,0.04));
9760
- }
9761
- .creator-new-arrow {
9762
- margin-left: auto;
9763
- opacity: 0.5;
9764
- transition: opacity .15s, transform .15s;
9765
- }
9766
- .creator-new-card:hover .creator-new-arrow {
9767
- opacity: 1;
9768
- transform: translateX(3px);
9769
- }
9770
-
9771
- /* ── State messages ────────────────────────────────────────────────────── */
9772
- .creator-loading,
9773
- .creator-empty {
9774
- text-align: center;
9775
- color: var(--color-text-tertiary);
9776
- font-size: 0.8125rem;
9777
- padding: 1.5rem 0;
9778
- }
9779
- .creator-error {
9780
- text-align: center;
9781
- color: var(--color-error, #ef4444);
9782
- font-size: 0.8125rem;
9783
- padding: 1.5rem 0;
9784
- }
9785
- .creator-notice {
9786
- font-size: 0.75rem;
9787
- padding: 0.5rem 0.75rem;
9788
- border-radius: 6px;
9789
- margin-bottom: 0.25rem;
9790
- }
9791
- .creator-notice-warn {
9792
- background: rgba(250, 173, 20, 0.1);
9793
- color: #b8860b;
9794
- border: 1px solid rgba(250, 173, 20, 0.3);
9795
- }
9796
- [data-theme="dark"] .creator-notice-warn { color: #f5c842; }
9797
-
9798
- /* ── Trash panel · Recently Deleted ────────────────────────────────── */
9799
-
9800
- /* Tab switches (file trash / session trash) — mirrors skills-tabs pattern */
9801
- #trash-tabs {
9802
- display: flex;
9803
- align-items: center;
9804
- justify-content: space-between;
9805
- border-bottom: 1px solid var(--color-border-primary);
9806
- margin-bottom: 0.75rem;
9807
- }
9808
- .trash-tabs-left {
9809
- display: flex;
9810
- align-items: center;
9811
- gap: 0.25rem;
9812
- }
9813
- .trash-tab {
9814
- background: none;
9815
- border: none;
9816
- border-bottom: 2px solid transparent;
9817
- color: var(--color-text-secondary);
9818
- cursor: pointer;
9819
- font-size: 0.8125rem;
9820
- font-weight: 500;
9821
- padding: 0.5rem 1rem;
9822
- margin-bottom: -1px;
9823
- transition: color .15s, border-color .15s;
9824
- }
9825
- .trash-tab:hover { color: var(--color-text-primary); }
9826
- .trash-tab.active { color: var(--color-accent-primary); border-bottom-color: var(--color-accent-primary); }
9827
-
9828
- .trash-tab-content {
9829
- flex: 1;
9830
- overflow-y: auto;
9831
- }
9832
-
9833
- /* Session trash card — similar to file trash card but shows session name and timestamp */
9834
- .trash-session-card {
9884
+ /* Session trash card similar to file trash card but shows session name and timestamp */
9885
+ .trash-session-card {
9835
9886
  background: var(--color-bg-secondary);
9836
9887
  border: 1px solid var(--color-border-primary);
9837
9888
  border-radius: 10px;
@@ -9908,11 +9959,68 @@ body.setup-mode[data-theme="dark"] {
9908
9959
  opacity: .5;
9909
9960
  cursor: not-allowed;
9910
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
+ }
9911
9995
  .trash-summary {
9912
9996
  font-size: 0.6875rem;
9913
9997
  color: var(--color-text-muted);
9914
9998
  margin-right: auto;
9915
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
+ }
9916
10024
  .trash-actions {
9917
10025
  display: flex;
9918
10026
  align-items: center;
@@ -11634,16 +11742,16 @@ body.setup-mode[data-theme="dark"] {
11634
11742
  .share-modal {
11635
11743
  position: relative;
11636
11744
  width: 100%;
11637
- max-width: 660px;
11745
+ max-width: 780px;
11638
11746
  max-height: 90vh;
11639
11747
  overflow-y: auto;
11640
11748
  background: var(--color-bg-card);
11641
11749
  border: 1px solid var(--color-border-primary);
11642
11750
  border-radius: var(--radius-lg, 14px);
11643
- box-shadow: 0 18px 48px rgba(15, 18, 28, 0.22);
11644
- padding: 24px;
11645
- transform: translateY(8px) scale(.98);
11646
- 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;
11647
11755
  }
11648
11756
  .share-overlay.open .share-modal { transform: translateY(0) scale(1); }
11649
11757
 
@@ -11657,59 +11765,81 @@ body.setup-mode[data-theme="dark"] {
11657
11765
  line-height: 1;
11658
11766
  color: var(--color-text-muted);
11659
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));
11660
11779
  }
11661
- .share-close:hover { color: var(--color-text-primary); }
11662
11780
 
11663
11781
  .share-title {
11664
11782
  margin: 0 0 4px;
11665
- font-size: 1.0625rem;
11783
+ font-size: 1.125rem;
11666
11784
  font-weight: 700;
11667
11785
  color: var(--color-text-primary);
11668
11786
  }
11669
11787
  .share-subtitle {
11670
- margin: 0 0 16px;
11788
+ margin: 0 0 20px;
11671
11789
  font-size: 0.8125rem;
11672
11790
  color: var(--color-text-tertiary);
11673
11791
  }
11674
11792
 
11675
11793
  .share-body {
11676
11794
  display: flex;
11677
- gap: 20px;
11678
- align-items: flex-start;
11795
+ gap: 24px;
11796
+ align-items: stretch;
11679
11797
  }
11680
11798
  .share-controls {
11681
11799
  flex: 1;
11682
11800
  min-width: 0;
11801
+ display: flex;
11802
+ flex-direction: column;
11803
+ }
11804
+ .share-actions {
11805
+ margin-top: auto;
11683
11806
  }
11684
11807
 
11685
11808
  .share-poster-wrap {
11686
- display: flex;
11687
- justify-content: center;
11688
11809
  flex-shrink: 0;
11810
+ display: flex;
11689
11811
  }
11690
11812
  .share-poster-img {
11691
- width: 220px;
11813
+ width: 250px;
11814
+ object-fit: cover;
11692
11815
  border-radius: var(--radius-md, 10px);
11693
- 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);
11694
11822
  }
11695
11823
 
11696
- @media (max-width: 560px) {
11824
+ @media (max-width: 620px) {
11697
11825
  .share-body { flex-direction: column; align-items: stretch; }
11698
11826
  .share-poster-wrap { margin-bottom: 4px; }
11699
- .share-poster-img { width: 180px; }
11827
+ .share-poster-img { width: 100%; height: 200px; }
11700
11828
  }
11701
11829
 
11702
11830
  .share-row-label {
11703
- font-size: 0.75rem;
11831
+ font-size: 0.6875rem;
11704
11832
  font-weight: 600;
11705
- color: var(--color-text-tertiary);
11833
+ letter-spacing: .04em;
11834
+ text-transform: uppercase;
11835
+ color: var(--color-text-muted);
11706
11836
  }
11707
11837
 
11708
11838
  .share-theme-row {
11709
11839
  display: flex;
11710
11840
  flex-direction: column;
11711
- gap: 6px;
11712
- margin-bottom: 14px;
11841
+ gap: 8px;
11842
+ margin-bottom: 16px;
11713
11843
  }
11714
11844
  .share-theme-chips {
11715
11845
  display: flex;
@@ -11717,29 +11847,46 @@ body.setup-mode[data-theme="dark"] {
11717
11847
  }
11718
11848
  .share-theme-chip {
11719
11849
  flex: 1;
11720
- height: 34px;
11850
+ height: 40px;
11721
11851
  border: 2px solid transparent;
11722
- border-radius: var(--radius-sm, 6px);
11852
+ border-radius: var(--radius-sm, 8px);
11723
11853
  cursor: pointer;
11724
11854
  position: relative;
11725
11855
  display: flex;
11726
11856
  align-items: center;
11727
11857
  justify-content: center;
11728
- 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);
11729
11866
  }
11730
- .share-theme-chip:hover { transform: translateY(-1px); }
11731
- .share-theme-chip.is-active { border-color: var(--color-button-primary); }
11732
11867
  .share-theme-name {
11733
11868
  font-size: 0.6875rem;
11734
11869
  font-weight: 700;
11735
- color: rgba(0,0,0,.55);
11736
- text-shadow: 0 1px 0 rgba(255,255,255,.4);
11737
11870
  pointer-events: none;
11738
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
+ }
11739
11880
  .share-theme-chip[data-theme="geek"] .share-theme-name {
11740
11881
  color: rgba(255,255,255,.92);
11741
11882
  text-shadow: 0 1px 2px rgba(0,0,0,.4);
11742
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
+ }
11743
11890
 
11744
11891
  .share-periods {
11745
11892
  display: inline-flex;
@@ -11771,7 +11918,7 @@ body.setup-mode[data-theme="dark"] {
11771
11918
  display: grid;
11772
11919
  grid-template-columns: repeat(4, 1fr);
11773
11920
  gap: 8px;
11774
- margin-bottom: 14px;
11921
+ margin-bottom: 16px;
11775
11922
  }
11776
11923
  .share-platform {
11777
11924
  padding: 9px 4px;
@@ -11779,22 +11926,31 @@ body.setup-mode[data-theme="dark"] {
11779
11926
  border-radius: var(--radius-sm, 6px);
11780
11927
  background: var(--color-bg-primary);
11781
11928
  color: var(--color-text-secondary);
11782
- font-size: 0.8125rem;
11929
+ font-size: 0.75rem;
11783
11930
  font-weight: 600;
11784
11931
  cursor: pointer;
11785
- 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;
11786
11937
  }
11787
11938
  .share-platform:hover {
11788
11939
  background: var(--color-bg-hover);
11789
11940
  border-color: var(--color-border-strong);
11941
+ transform: translateY(-1px);
11790
11942
  }
11791
11943
  .share-platform.is-active {
11792
11944
  background: var(--color-button-primary);
11793
11945
  color: var(--color-button-primary-text);
11794
11946
  border-color: var(--color-button-primary);
11795
11947
  }
11948
+ .share-platform-icon {
11949
+ font-size: 1.125rem;
11950
+ line-height: 1;
11951
+ }
11796
11952
 
11797
- .share-editor { margin-bottom: 14px; }
11953
+ .share-editor { margin-bottom: 16px; }
11798
11954
  .share-editor-head {
11799
11955
  display: flex;
11800
11956
  align-items: center;
@@ -11809,25 +11965,29 @@ body.setup-mode[data-theme="dark"] {
11809
11965
  font-weight: 600;
11810
11966
  cursor: pointer;
11811
11967
  padding: 2px 4px;
11968
+ border-radius: 4px;
11969
+ transition: background .1s ease;
11812
11970
  }
11813
- .share-shuffle:hover { text-decoration: underline; }
11971
+ .share-shuffle:hover { background: var(--color-bg-hover); }
11814
11972
  .share-text {
11815
11973
  width: 100%;
11816
11974
  box-sizing: border-box;
11817
11975
  resize: vertical;
11818
- min-height: 72px;
11976
+ min-height: 80px;
11819
11977
  padding: 10px 12px;
11820
11978
  border: 1px solid var(--color-border-primary);
11821
11979
  border-radius: var(--radius-sm, 6px);
11822
11980
  background: var(--color-bg-primary);
11823
11981
  color: var(--color-text-primary);
11824
11982
  font-size: 0.8125rem;
11825
- line-height: 1.5;
11983
+ line-height: 1.6;
11826
11984
  font-family: inherit;
11985
+ transition: border-color .12s ease;
11827
11986
  }
11828
11987
  .share-text:focus {
11829
11988
  outline: none;
11830
11989
  border-color: var(--color-button-primary);
11990
+ box-shadow: 0 0 0 2px rgba(var(--color-button-primary-rgb, 124,58,237), .12);
11831
11991
  }
11832
11992
 
11833
11993
  .share-actions {
@@ -11835,28 +11995,44 @@ body.setup-mode[data-theme="dark"] {
11835
11995
  flex-wrap: wrap;
11836
11996
  gap: 8px;
11837
11997
  }
11838
- .share-btn-primary, .share-btn-secondary {
11839
- padding: 10px;
11840
- border-radius: var(--radius-sm, 6px);
11841
- font-size: 0.8125rem;
11842
- font-weight: 600;
11843
- cursor: pointer;
11844
- border: 1px solid var(--color-border-primary);
11845
- }
11846
11998
  .share-btn-primary {
11847
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;
11848
12006
  background: var(--color-button-primary);
11849
12007
  color: var(--color-button-primary-text);
11850
- 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);
11851
12016
  }
11852
- .share-btn-primary:hover { background: var(--color-button-primary-hover); }
12017
+ .share-btn-primary:active { transform: translateY(0); }
11853
12018
  .share-btn-secondary {
11854
- flex: 1 1 calc(50% - 4px);
11855
- 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);
11856
12027
  background: var(--color-bg-primary);
11857
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);
11858
12035
  }
11859
- .share-btn-secondary:hover { background: var(--color-bg-hover); }
11860
12036
 
11861
12037
  #share-toggle-header svg { display: block; }
11862
12038
 
@@ -12136,10 +12312,9 @@ body.setup-mode[data-theme="dark"] {
12136
12312
  gap: 0.75rem;
12137
12313
  }
12138
12314
 
12139
- /* ── Billing / Trash / Creator pages ── */
12315
+ /* ── Billing / Trash pages ── */
12140
12316
  #billing-body { padding: 1rem 1rem 1rem; }
12141
12317
  #trash-body { padding: 1rem 1rem 1rem; }
12142
- #creator-body { padding: 1rem 1rem 1rem; }
12143
12318
 
12144
12319
  .billing-heatmap-row { grid-template-columns: 1fr; }
12145
12320