viberoom 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/NOTICE +14 -0
  2. package/dist/hub.js +45 -4
  3. package/dist/main.js +1 -1
  4. package/dist/recipes.js +2 -1
  5. package/dist/shortcuts.js +1 -1
  6. package/package.json +1 -1
  7. package/ui/app.css +131 -107
  8. package/ui/app.js +334 -87
  9. package/ui/avatars.js +7 -14
  10. package/ui/components.css +116 -21
  11. package/ui/components.js +202 -1
  12. package/ui/fonts/anonymous-pro-cyrillic-400.woff2 +0 -0
  13. package/ui/fonts/anonymous-pro-cyrillic-700.woff2 +0 -0
  14. package/ui/fonts/anonymous-pro-latin-400.woff2 +0 -0
  15. package/ui/fonts/anonymous-pro-latin-700.woff2 +0 -0
  16. package/ui/fonts/anonymous-pro-latin-ext-400.woff2 +0 -0
  17. package/ui/fonts/anonymous-pro-latin-ext-700.woff2 +0 -0
  18. package/ui/fonts/anonymous-pro.css +7 -0
  19. package/ui/fonts/cascadia-code-cyrillic-ext.woff2 +0 -0
  20. package/ui/fonts/cascadia-code-cyrillic.woff2 +0 -0
  21. package/ui/fonts/cascadia-code-latin-ext.woff2 +0 -0
  22. package/ui/fonts/cascadia-code-latin.woff2 +0 -0
  23. package/ui/fonts/cascadia-code.css +5 -0
  24. package/ui/fonts/comfortaa-cyrillic-ext.woff2 +0 -0
  25. package/ui/fonts/comfortaa-cyrillic.woff2 +0 -0
  26. package/ui/fonts/comfortaa-latin-ext.woff2 +0 -0
  27. package/ui/fonts/comfortaa-latin.woff2 +0 -0
  28. package/ui/fonts/comfortaa.css +5 -0
  29. package/ui/fonts/exo-2-cyrillic-ext.woff2 +0 -0
  30. package/ui/fonts/exo-2-cyrillic.woff2 +0 -0
  31. package/ui/fonts/exo-2-latin-ext.woff2 +0 -0
  32. package/ui/fonts/exo-2-latin.woff2 +0 -0
  33. package/ui/fonts/exo-2.css +5 -0
  34. package/ui/fonts/golos-text-cyrillic-ext.woff2 +0 -0
  35. package/ui/fonts/golos-text-cyrillic.woff2 +0 -0
  36. package/ui/fonts/golos-text-latin-ext.woff2 +0 -0
  37. package/ui/fonts/golos-text-latin.woff2 +0 -0
  38. package/ui/fonts/golos-text.css +5 -0
  39. package/ui/fonts/ibm-plex-mono-cyrillic-400.woff2 +0 -0
  40. package/ui/fonts/ibm-plex-mono-cyrillic-600.woff2 +0 -0
  41. package/ui/fonts/ibm-plex-mono-cyrillic-700.woff2 +0 -0
  42. package/ui/fonts/ibm-plex-mono-cyrillic-ext-400.woff2 +0 -0
  43. package/ui/fonts/ibm-plex-mono-cyrillic-ext-600.woff2 +0 -0
  44. package/ui/fonts/ibm-plex-mono-cyrillic-ext-700.woff2 +0 -0
  45. package/ui/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  46. package/ui/fonts/ibm-plex-mono-latin-600.woff2 +0 -0
  47. package/ui/fonts/ibm-plex-mono-latin-700.woff2 +0 -0
  48. package/ui/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  49. package/ui/fonts/ibm-plex-mono-latin-ext-600.woff2 +0 -0
  50. package/ui/fonts/ibm-plex-mono-latin-ext-700.woff2 +0 -0
  51. package/ui/fonts/ibm-plex-mono.css +13 -0
  52. package/ui/fonts/ibm-plex-sans-cyrillic-400.woff2 +0 -0
  53. package/ui/fonts/ibm-plex-sans-cyrillic-600.woff2 +0 -0
  54. package/ui/fonts/ibm-plex-sans-cyrillic-700.woff2 +0 -0
  55. package/ui/fonts/ibm-plex-sans-cyrillic-ext-400.woff2 +0 -0
  56. package/ui/fonts/ibm-plex-sans-cyrillic-ext-600.woff2 +0 -0
  57. package/ui/fonts/ibm-plex-sans-cyrillic-ext-700.woff2 +0 -0
  58. package/ui/fonts/ibm-plex-sans-latin-400.woff2 +0 -0
  59. package/ui/fonts/ibm-plex-sans-latin-600.woff2 +0 -0
  60. package/ui/fonts/ibm-plex-sans-latin-700.woff2 +0 -0
  61. package/ui/fonts/ibm-plex-sans-latin-ext-400.woff2 +0 -0
  62. package/ui/fonts/ibm-plex-sans-latin-ext-600.woff2 +0 -0
  63. package/ui/fonts/ibm-plex-sans-latin-ext-700.woff2 +0 -0
  64. package/ui/fonts/ibm-plex-sans.css +13 -0
  65. package/ui/fonts/manrope-cyrillic-ext.woff2 +0 -0
  66. package/ui/fonts/manrope-cyrillic.woff2 +0 -0
  67. package/ui/fonts/manrope-latin-ext.woff2 +0 -0
  68. package/ui/fonts/manrope-latin.woff2 +0 -0
  69. package/ui/fonts/manrope.css +5 -0
  70. package/ui/fonts/montserrat-cyrillic-ext.woff2 +0 -0
  71. package/ui/fonts/montserrat-cyrillic.woff2 +0 -0
  72. package/ui/fonts/montserrat-latin-ext.woff2 +0 -0
  73. package/ui/fonts/montserrat-latin.woff2 +0 -0
  74. package/ui/fonts/montserrat.css +5 -0
  75. package/ui/fonts/open-sans-cyrillic-ext.woff2 +0 -0
  76. package/ui/fonts/open-sans-cyrillic.woff2 +0 -0
  77. package/ui/fonts/open-sans-latin-ext.woff2 +0 -0
  78. package/ui/fonts/open-sans-latin.woff2 +0 -0
  79. package/ui/fonts/open-sans.css +5 -0
  80. package/ui/fonts/pt-mono-cyrillic-ext.woff2 +0 -0
  81. package/ui/fonts/pt-mono-cyrillic.woff2 +0 -0
  82. package/ui/fonts/pt-mono-latin-ext.woff2 +0 -0
  83. package/ui/fonts/pt-mono-latin.woff2 +0 -0
  84. package/ui/fonts/pt-mono.css +5 -0
  85. package/ui/fonts/rubik-cyrillic-ext.woff2 +0 -0
  86. package/ui/fonts/rubik-cyrillic.woff2 +0 -0
  87. package/ui/fonts/rubik-latin-ext.woff2 +0 -0
  88. package/ui/fonts/rubik-latin.woff2 +0 -0
  89. package/ui/fonts/rubik.css +5 -0
  90. package/ui/fonts/source-sans-3-cyrillic-ext.woff2 +0 -0
  91. package/ui/fonts/source-sans-3-cyrillic.woff2 +0 -0
  92. package/ui/fonts/source-sans-3-latin-ext.woff2 +0 -0
  93. package/ui/fonts/source-sans-3-latin.woff2 +0 -0
  94. package/ui/fonts/source-sans-3.css +5 -0
  95. package/ui/fonts/ubuntu-sans-cyrillic-ext.woff2 +0 -0
  96. package/ui/fonts/ubuntu-sans-cyrillic.woff2 +0 -0
  97. package/ui/fonts/ubuntu-sans-latin-ext.woff2 +0 -0
  98. package/ui/fonts/ubuntu-sans-latin.woff2 +0 -0
  99. package/ui/fonts/ubuntu-sans.css +5 -0
  100. package/ui/fonts/victor-mono-cyrillic-ext.woff2 +0 -0
  101. package/ui/fonts/victor-mono-cyrillic.woff2 +0 -0
  102. package/ui/fonts/victor-mono-latin-ext.woff2 +0 -0
  103. package/ui/fonts/victor-mono-latin.woff2 +0 -0
  104. package/ui/fonts/victor-mono.css +5 -0
  105. package/ui/index.html +15 -6
  106. package/ui/looks.css +2446 -0
  107. package/ui/manifest.json +3 -3
  108. package/ui/theme.css +114 -84
  109. package/ui/tokens.js +315 -29
  110. package/ui/ui.js +2 -0
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Cascadia Code"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/cascadia-code-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Cascadia Code"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/cascadia-code-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Cascadia Code"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/cascadia-code-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Cascadia Code"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/cascadia-code-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Comfortaa"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/comfortaa-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Comfortaa"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/comfortaa-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Comfortaa"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/comfortaa-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Comfortaa"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/comfortaa-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
Binary file
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Exo 2"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/exo-2-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Exo 2"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/exo-2-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Exo 2"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/exo-2-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Exo 2"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/exo-2-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Golos Text"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/golos-text-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Golos Text"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/golos-text-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Golos Text"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/golos-text-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Golos Text"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/golos-text-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@@ -0,0 +1,13 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-mono-cyrillic-ext-400.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-mono-cyrillic-400.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-mono-latin-ext-400.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-mono-latin-400.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
6
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-mono-cyrillic-ext-600.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
7
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-mono-cyrillic-600.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
8
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-mono-latin-ext-600.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
9
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-mono-latin-600.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
10
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-mono-cyrillic-ext-700.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
11
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-mono-cyrillic-700.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
12
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-mono-latin-ext-700.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
13
+ @font-face { font-family: "IBM Plex Mono"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-mono-latin-700.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@@ -0,0 +1,13 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-sans-cyrillic-ext-400.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-sans-cyrillic-400.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-sans-latin-ext-400.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/ibm-plex-sans-latin-400.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
6
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-sans-cyrillic-ext-600.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
7
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-sans-cyrillic-600.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
8
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-sans-latin-ext-600.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
9
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 600; font-display: swap; src: url("/fonts/ibm-plex-sans-latin-600.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
10
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-sans-cyrillic-ext-700.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
11
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-sans-cyrillic-700.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
12
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-sans-latin-ext-700.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
13
+ @font-face { font-family: "IBM Plex Sans"; font-style: normal; font-weight: 700; font-display: swap; src: url("/fonts/ibm-plex-sans-latin-700.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
Binary file
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Manrope"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/manrope-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Manrope"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/manrope-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Manrope"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/manrope-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Manrope"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/manrope-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Montserrat"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/montserrat-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Montserrat"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/montserrat-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Montserrat"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/montserrat-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Montserrat"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/montserrat-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/open-sans-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/open-sans-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/open-sans-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Open Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/open-sans-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
Binary file
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "PT Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/pt-mono-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "PT Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/pt-mono-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "PT Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/pt-mono-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "PT Mono"; font-style: normal; font-weight: 400; font-display: swap; src: url("/fonts/pt-mono-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
Binary file
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Rubik"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/rubik-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Source Sans 3"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/source-sans-3-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Ubuntu Sans"; font-style: normal; font-weight: 400 800; font-display: swap; src: url("/fonts/ubuntu-sans-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
Binary file
@@ -0,0 +1,5 @@
1
+ /* viberoom - Copyright (c) 2026 Todor Rusev - AGPL-3.0-or-later; see LICENSE */
2
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-cyrillic-ext.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
3
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-cyrillic.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
4
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-latin-ext.woff2") format("woff2"); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
5
+ @font-face { font-family: "Victor Mono"; font-style: normal; font-weight: 400 700; font-display: swap; src: url("/fonts/victor-mono-latin.woff2") format("woff2"); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
package/ui/index.html CHANGED
@@ -5,12 +5,13 @@
5
5
  <meta charset="utf-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
7
  <title>viberoom</title>
8
- <link rel="icon" href="/icon.svg?v=7" type="image/svg+xml">
9
- <link rel="icon" href="/favicon.ico?v=7" sizes="any">
10
- <link rel="apple-touch-icon" href="/icon-256.png?v=7">
8
+ <link rel="icon" href="/favicon.ico?v=8" sizes="16x16 32x32 48x48 64x64 128x128 256x256">
9
+ <link rel="icon" href="/icon-256.png?v=8" type="image/png" sizes="256x256">
10
+ <link rel="apple-touch-icon" href="/icon-256.png?v=8">
11
11
  <link rel="manifest" href="/manifest.json">
12
12
  <meta name="theme-color" content="#6d5dfc">
13
13
  <link rel="stylesheet" href="/theme.css">
14
+ <link rel="stylesheet" href="/looks.css">
14
15
  <link rel="stylesheet" href="/components.css">
15
16
  <link rel="stylesheet" href="/app.css">
16
17
  </head>
@@ -133,6 +134,14 @@
133
134
  <div class="actions"><button type="submit" data-ui="button" data-kind="primary" data-size="lg">Start vibing</button></div>
134
135
  </form>
135
136
  </dialog>
137
+ <dialog id="look-dialog" class="dialog wide">
138
+ <form id="look-form" method="dialog">
139
+ <h3><span class="h-ico" data-icon="eye"></span>Pick a look</h3>
140
+ <p class="lead">How viberoom is drawn. A click tries a look on the window at once; change it, or fine-tune it, any time under Settings → Appearance.</p>
141
+ <div class="look-cards" id="look-dialog-cards"></div>
142
+ <div class="actions"><button type="submit" data-ui="button" data-kind="primary" data-size="lg">Keep this look</button></div>
143
+ </form>
144
+ </dialog>
136
145
  <dialog id="confirm-dialog" class="dialog narrow">
137
146
  <form method="dialog">
138
147
  <h3 id="cf-title">Are you sure?</h3>
@@ -201,7 +210,7 @@
201
210
  <details class="geek" id="inv-geek">
202
211
  <summary><span data-icon="geek"></span>for geeks<span class="g-hint">reply delay, skills, where the vibemate lives</span><span class="chev" data-icon="down"></span></summary>
203
212
  <div class="geek-body">
204
- <label>Reply delay override, seconds<button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>Empty: the room's delay. A value here overrides it for this vibemate only. Before each turn the vibemate waits a random 0–N seconds, so replies cross less often; messages that arrive meanwhile land in its backlog.</span><input id="inv-delay" type="number" min="0" max="120" step="0.5" placeholder="the room's"></label>
213
+ <label>Reply delay override, seconds<button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>Empty: the room's delay. A value here overrides it for this vibemate only. Before each turn the vibemate waits a random 0–N seconds, so replies cross less often; messages that arrive meanwhile land in its backlog.</span><span data-ui="number-field"><input id="inv-delay" type="number" min="0" max="120" step="0.5" placeholder="the room's"><span class="steps" aria-hidden="true"><button type="button" data-act="up" tabindex="-1" title="More"></button><button type="button" data-act="down" tabindex="-1" title="Less"></button></span></span></label>
205
214
  <label>Skills <span class="hint">(from the library)</span><div id="inv-skills" class="check-list"></div></label>
206
215
  <p class="hint" id="inv-where"></p>
207
216
  <p class="hint" id="inv-note"></p>
@@ -248,7 +257,7 @@
248
257
  <h3><span class="h-ico" data-icon="refresh"></span>Welcome back</h3>
249
258
  <p class="lead" id="rc-intro"></p>
250
259
  <div class="choice-list">
251
- <label class="choice"><input type="radio" name="rc-mode" value="replay" checked> <span><strong>Replay the last</strong> <input id="rc-replay" type="number" min="0" max="500" value="10" class="rc-num"> <strong>chat messages</strong> — a fresh start with the recent history.<span class="rc-is-default" hidden>default</span><button type="button" class="link-btn rc-default" data-mode="replay" hidden>Make default</button><button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>A new vibemate session that reads the recent room history (room events in between come along), like a person coming back from a break. Cheap and works for every vibemate.</span></span></label>
260
+ <label class="choice"><input type="radio" name="rc-mode" value="replay" checked> <span><strong>Replay the last</strong> <span data-ui="number-field" class="rc-num"><input id="rc-replay" type="number" min="0" max="500" value="10"><span class="steps" aria-hidden="true"><button type="button" data-act="up" tabindex="-1" title="More"></button><button type="button" data-act="down" tabindex="-1" title="Less"></button></span></span> <strong>chat messages</strong> — a fresh start with the recent history.<span class="rc-is-default" hidden>default</span><button type="button" class="link-btn rc-default" data-mode="replay" hidden>Make default</button><button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>A new vibemate session that reads the recent room history (room events in between come along), like a person coming back from a break. Cheap and works for every vibemate.</span></span></label>
252
261
  <label class="choice"><input type="radio" name="rc-mode" value="load"> <span><strong>Restore the full session</strong> — the vibemate comes back with everything it knew.<span class="rc-is-default" hidden>default</span><button type="button" class="link-btn rc-default" data-mode="load" hidden>Make default</button><button type="button" class="geek-tip" title="For geeks"><span data-icon="geek"></span>for geeks</button><span class="geek-text" hidden>ACP <code>session/load</code>: the vibemate reloads its own stored conversation, with tool results and reasoning. Its next turn pays for the whole history again. Falls back to replay if the vibemate cannot load it.</span></span></label>
253
262
  </div>
254
263
  <table class="rc-table" id="rc-table"></table>
@@ -295,7 +304,7 @@
295
304
  <div class="fv-tools" id="fv-tools" hidden>
296
305
  <label class="search fv-find"><span class="search-icon" data-icon="search"></span><input id="fv-search" type="search" placeholder="Find in this file…" autocomplete="off"></label>
297
306
  <span class="fv-hits" id="fv-hits"></span>
298
- <label class="fv-goto">line <input id="fv-line" type="number" min="1" step="1" placeholder="1"></label>
307
+ <label class="fv-goto">line <span data-ui="number-field" class="fv-num"><input id="fv-line" type="number" min="1" step="1" placeholder="1"><span class="steps" aria-hidden="true"><button type="button" data-act="up" tabindex="-1" title="More"></button><button type="button" data-act="down" tabindex="-1" title="Less"></button></span></span></label>
299
308
  <label class="fv-wrap"><input id="fv-wrap" type="checkbox"> wrap</label>
300
309
  <span class="fv-count" id="fv-count"></span>
301
310
  </div>