feeds-fun 0.5.1 → 1.1.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 (45) hide show
  1. package/package.json +25 -23
  2. package/postcss.config.js +6 -0
  3. package/src/components/ConfigFlag.vue +6 -14
  4. package/src/components/ConfigSelector.vue +3 -1
  5. package/src/components/DiscoveryForm.vue +9 -2
  6. package/src/components/EntriesList.vue +15 -4
  7. package/src/components/EntryForList.vue +76 -65
  8. package/src/components/FeedForList.vue +15 -32
  9. package/src/components/FeedInfo.vue +11 -4
  10. package/src/components/FeedsCollections.vue +23 -15
  11. package/src/components/FeedsList.vue +7 -18
  12. package/src/components/FfunTag.vue +6 -13
  13. package/src/components/NotificationCollections.vue +7 -0
  14. package/src/components/NotificationOpenaiApiKey.vue +28 -0
  15. package/src/components/Notifications.vue +32 -0
  16. package/src/components/OPMLUpload.vue +3 -0
  17. package/src/components/RuleConstructor.vue +19 -27
  18. package/src/components/RuleForList.vue +47 -0
  19. package/src/components/RulesList.vue +7 -43
  20. package/src/components/SimplePagination.vue +4 -6
  21. package/src/components/SupertokensLogin.vue +50 -25
  22. package/src/components/TagsFilter.vue +13 -25
  23. package/src/components/TagsList.vue +27 -25
  24. package/src/components/UserSetting.vue +41 -38
  25. package/src/components/UserSettingForNotification.vue +63 -0
  26. package/src/inputs/Marker.vue +3 -7
  27. package/src/inputs/ScoreSelector.vue +11 -12
  28. package/src/layouts/SidePanelLayout.vue +42 -96
  29. package/src/layouts/WideLayout.vue +2 -25
  30. package/src/logic/api.ts +3 -3
  31. package/src/logic/settings.ts +0 -9
  32. package/src/main.ts +12 -19
  33. package/src/stores/entries.ts +1 -6
  34. package/src/style.css +92 -0
  35. package/src/values/Score.vue +1 -10
  36. package/src/views/AuthView.vue +3 -7
  37. package/src/views/CollectionsView.vue +2 -0
  38. package/src/views/FeedsView.vue +8 -3
  39. package/src/views/MainView.vue +36 -83
  40. package/src/views/NewsView.vue +30 -13
  41. package/src/views/RulesView.vue +0 -2
  42. package/src/views/SettingsView.vue +35 -22
  43. package/tailwind.config.js +14 -0
  44. package/src/components/EntryInfo.vue +0 -23
  45. package/src/components/FfunGithubButtons.vue +0 -22
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <button
3
+ v-if="setting"
4
+ @click.prevent="updateFlag(true)"
5
+ class="ffun-form-button"
6
+ >{{ text }}</button
7
+ >
8
+ </template>
9
+
10
+ <script lang="ts" setup>
11
+ import {computed, ref, onUnmounted, watch} from "vue";
12
+ import {computedAsync} from "@vueuse/core";
13
+ import * as api from "@/logic/api";
14
+ import * as t from "@/logic/types";
15
+ import * as e from "@/logic/enums";
16
+ import {useGlobalSettingsStore} from "@/stores/globalSettings";
17
+
18
+ const globalSettings = useGlobalSettingsStore();
19
+
20
+ const properties = defineProps<{kind: string; buttonText: string}>();
21
+
22
+ const value = ref<boolean | null>(null);
23
+
24
+ const setting = computed(() => {
25
+ if (properties.kind === null) {
26
+ return null;
27
+ }
28
+
29
+ if (globalSettings.userSettings === null) {
30
+ return null;
31
+ }
32
+
33
+ return globalSettings.userSettings[properties.kind];
34
+ });
35
+
36
+ const text = computed(() => {
37
+ if (properties.buttonText) {
38
+ return properties.buttonText;
39
+ }
40
+
41
+ if (setting.value === null) {
42
+ return "";
43
+ }
44
+
45
+ return setting.value.name;
46
+ });
47
+
48
+ async function save() {
49
+ if (value.value === null) {
50
+ return;
51
+ }
52
+
53
+ await api.setUserSetting({kind: properties.kind, value: value.value});
54
+ globalSettings.updateDataVersion();
55
+ }
56
+
57
+ async function updateFlag(newValue: any) {
58
+ value.value = newValue;
59
+ await save();
60
+ }
61
+ </script>
62
+
63
+ <style></style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div style="display: inline-block">
2
+ <div>
3
3
  <template v-if="hasMarker">
4
4
  <a
5
5
  href="#"
@@ -57,14 +57,10 @@
57
57
 
58
58
  <style scoped>
59
59
  .marked {
60
- color: #2e8f2e;
61
- font-weight: bold;
62
- text-decoration: none;
60
+ @apply text-green-700 no-underline;
63
61
  }
64
62
 
65
63
  .unmarked {
66
- color: purple;
67
- /* font-weight: bold; */
68
- text-decoration: none;
64
+ @apply text-purple-700 font-bold no-underline;
69
65
  }
70
66
  </style>
@@ -1,16 +1,15 @@
1
1
  <template>
2
- <div>
3
- <select
4
- :value="modelValue"
5
- @input="updateSelected">
6
- <option
7
- v-for="score of scores"
8
- :value="score"
9
- :selected="modelValue === score">
10
- {{ score }}
11
- </option>
12
- </select>
13
- </div>
2
+ <select
3
+ class="ffun-input"
4
+ :value="modelValue"
5
+ @input="updateSelected">
6
+ <option
7
+ v-for="score of scores"
8
+ :value="score"
9
+ :selected="modelValue === score">
10
+ {{ score }}
11
+ </option>
12
+ </select>
14
13
  </template>
15
14
 
16
15
  <script lang="ts" setup>
@@ -1,40 +1,30 @@
1
1
  <template>
2
- <div class="container">
3
- <div class="nav-panel">
4
- <h2 style="margin-top: 0; margin-bottom: 0">
2
+ <div class="flex divide-x">
3
+ <div class="p-4 w-60 bg-slate-200 flex-shrink-0">
4
+ <h2 class="leading-8 my-0">
5
5
  <slot name="main-header"></slot>
6
6
  </h2>
7
7
 
8
8
  <hr />
9
9
 
10
- <ul class="config-menu">
11
- <li
12
- v-if="hasSideMenuItem(1)"
13
- class="config-menu-item">
10
+ <ul class="space-y-2">
11
+ <li v-if="hasSideMenuItem(1)">
14
12
  <slot name="side-menu-item-1"></slot>
15
13
  </li>
16
14
 
17
- <li
18
- v-if="hasSideMenuItem(2)"
19
- class="config-menu-item">
15
+ <li v-if="hasSideMenuItem(2)">
20
16
  <slot name="side-menu-item-2"></slot>
21
17
  </li>
22
18
 
23
- <li
24
- v-if="hasSideMenuItem(3)"
25
- class="config-menu-item">
19
+ <li v-if="hasSideMenuItem(3)">
26
20
  <slot name="side-menu-item-3"></slot>
27
21
  </li>
28
22
 
29
- <li
30
- v-if="hasSideMenuItem(4)"
31
- class="config-menu-item">
23
+ <li v-if="hasSideMenuItem(4)">
32
24
  <slot name="side-menu-item-4"></slot>
33
25
  </li>
34
26
 
35
- <li
36
- v-if="hasSideMenuItem(5)"
37
- class="config-menu-item">
27
+ <li v-if="hasSideMenuItem(5)">
38
28
  <slot name="side-menu-item-5"></slot>
39
29
  </li>
40
30
  </ul>
@@ -42,6 +32,7 @@
42
32
  <hr v-if="reloadButton" />
43
33
 
44
34
  <a
35
+ class="ffun-form-button p-1 my-1 block w-full text-center"
45
36
  v-if="reloadButton"
46
37
  href="#"
47
38
  @click="globalSettings.dataVersion += 1"
@@ -53,80 +44,72 @@
53
44
  <slot name="side-footer"></slot>
54
45
  </div>
55
46
 
56
- <div class="main-content">
57
- <header style="padding-top: 1rem; display: flex; align-items: center">
58
- <div style="display: flex; align-items: center; margin-right: auto">
59
- <ul style="list-style-type: none; margin: 0; padding: 0">
60
- <li style="display: inline-block; margin-right: 0.5rem">
47
+ <div class="flex-grow p-4">
48
+ <header class="flex items-center leading-8">
49
+ <div class="display:flex items-center mr-auto">
50
+ <ul class="list-none m-0 p-0 flex space-x-2">
51
+ <li>
61
52
  <a
62
- href="#"
53
+ href="/"
54
+ class="ffun-header-link"
63
55
  @click.prevent="router.push({name: 'main', params: {}})"
64
- style="text-decoration: none"
65
56
  >Home</a
66
57
  >
67
58
  </li>
68
59
 
69
60
  <li
70
61
  v-for="[mode, props] of e.MainPanelModeProperties"
71
- :key="mode"
72
- style="display: inline-block; margin-right: 0.5rem">
62
+ :key="mode">
73
63
  <a
74
64
  v-if="globalSettings.mainPanelMode !== mode"
75
- href="#"
76
- @click.prevent="router.push({name: mode, params: {}})"
77
- style="text-decoration: none">
65
+ :href="mode"
66
+ class="ffun-header-link"
67
+ @click.prevent="router.push({name: mode, params: {}})">
78
68
  {{ props.text }}
79
69
  </a>
80
70
 
81
- <span v-else>{{ props.text }}</span>
71
+ <span
72
+ class="ffun-header-link-disabled cursor-default"
73
+ v-else
74
+ >{{ props.text }}</span
75
+ >
82
76
  </li>
83
77
 
84
- <li style="display: inline-block; margin-right: 0.5rem">
78
+ <li>
85
79
  <a
86
80
  href="/api/docs"
87
81
  target="_blank"
82
+ class="ffun-header-link"
88
83
  style="text-decoration: none"
89
84
  >API&#8599;</a
90
85
  >
91
86
  </li>
87
+
88
+ <li>
89
+ <a
90
+ :href="settings.githubRepo"
91
+ target="_blank"
92
+ class="ffun-header-link"
93
+ style="text-decoration: none"
94
+ >GitHub&#8599;</a
95
+ >
96
+ </li>
92
97
  </ul>
93
98
  </div>
94
99
 
95
- <div style="display: flex; align-items: center; margin-left: 1rem">
96
- <ffun-github-buttons
97
- :repository="settings.githubRepo"
98
- style="margin-top: 0.3rem" />
99
- &nbsp;|&nbsp;
100
+ <div class="flex items-center ml-4">
100
101
  <a
101
102
  href="#"
103
+ class="ffun-header-link"
102
104
  @click.prevent="logout()"
103
105
  >logout</a
104
106
  >
105
107
  </div>
106
108
  </header>
107
109
 
108
- <hr />
109
-
110
- <div
111
- v-if="showApiKeyMessage"
112
- style="border: 1px solid #ccc; padding: 1rem; margin-bottom: 1rem; background-color: #f0f8ff">
113
- <p>
114
- Because, for now, our service is free to use and OpenAI API costs money, we politely ask you to set up your
115
- own OpenAI API key.
116
- </p>
117
- <p>
118
- You can do it on the
119
- <a
120
- href="#"
121
- @click.prevent="router.push({name: e.MainPanelMode.Settings, params: {}})"
122
- >settings</a
123
- >
124
- page.
125
- </p>
126
- <user-setting kind="openai_hide_message_about_setting_up_key" />
127
- </div>
110
+ <hr class="my-2 border-slate-400" />
128
111
 
129
- <main>
112
+ <main class="mb-4">
130
113
  <slot></slot>
131
114
  </main>
132
115
 
@@ -178,14 +161,6 @@
178
161
  return !!slots[`side-menu-item-${index}`];
179
162
  }
180
163
 
181
- const showApiKeyMessage = computed(() => {
182
- return (
183
- globalSettings.userSettings &&
184
- !globalSettings.userSettings.openai_api_key.value &&
185
- !globalSettings.userSettings.openai_hide_message_about_setting_up_key.value
186
- );
187
- });
188
-
189
164
  watchEffect(() => {
190
165
  if (!properties.loginRequired) {
191
166
  return;
@@ -200,32 +175,3 @@
200
175
  }
201
176
  });
202
177
  </script>
203
-
204
- <style scoped>
205
- .container {
206
- display: flex;
207
- }
208
-
209
- .nav-panel {
210
- width: 11rem;
211
- flex-shrink: 0;
212
- background-color: #f0f0f0;
213
- padding: 1rem;
214
- }
215
-
216
- .main-content {
217
- flex-grow: 1;
218
- padding: 1rem;
219
- padding-top: 0;
220
- }
221
-
222
- .config-menu {
223
- list-style-type: none;
224
- margin: 0;
225
- padding: 0;
226
- }
227
-
228
- :deep(.config-menu-item) {
229
- margin-bottom: 1rem;
230
- }
231
- </style>
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <div class="container">
3
- <div class="main-content">
2
+ <div class="flex justify-center h-screen">
3
+ <div class="flex flex-col justify-start items-center text-center p-4">
4
4
  <header>
5
5
  <h1>
6
6
  <slot name="header"></slot>
@@ -19,26 +19,3 @@
19
19
  </template>
20
20
 
21
21
  <script lang="ts" setup></script>
22
-
23
- <style scoped>
24
- .container {
25
- display: flex;
26
- justify-content: center;
27
- /* align-items: center; */
28
- height: 100vh;
29
- }
30
-
31
- .main-content {
32
- /* flex-grow: 1; */
33
-
34
- display: flex;
35
- flex-direction: column;
36
- justify-content: start;
37
- align-items: center;
38
- text-align: center;
39
- width: 50%;
40
- /* margin-bottom: 50vh; */
41
- padding: 1rem;
42
- max-width: 960px;
43
- }
44
- </style>
package/src/logic/api.ts CHANGED
@@ -8,7 +8,7 @@ const ENTRY_POINT = "/api";
8
8
  const API_GET_FEEDS = `${ENTRY_POINT}/get-feeds`;
9
9
  const API_GET_LAST_ENTRIES = `${ENTRY_POINT}/get-last-entries`;
10
10
  const API_GET_ENTRIES_BY_IDS = `${ENTRY_POINT}/get-entries-by-ids`;
11
- const API_CREATE_RULE = `${ENTRY_POINT}/create-rule`;
11
+ const API_CREATE_OR_UPDATE_RULE = `${ENTRY_POINT}/create-or-update-rule`;
12
12
 
13
13
  const API_DELETE_RULE = `${ENTRY_POINT}/delete-rule`;
14
14
  const API_UPDATE_RULE = `${ENTRY_POINT}/update-rule`;
@@ -97,9 +97,9 @@ export async function getEntriesByIds({ids}: {ids: t.EntryId[]}) {
97
97
  return entries;
98
98
  }
99
99
 
100
- export async function createRule({tags, score}: {tags: string[]; score: number}) {
100
+ export async function createOrUpdateRule({tags, score}: {tags: string[]; score: number}) {
101
101
  const response = await post({
102
- url: API_CREATE_RULE,
102
+ url: API_CREATE_OR_UPDATE_RULE,
103
103
  data: {tags: tags, score: score}
104
104
  });
105
105
  return response;
@@ -13,11 +13,6 @@ export const authMode = import.meta.env.VITE_FFUN_AUTH_MODE || AuthMode.SingleUs
13
13
  export const authSupertokensApiBasePath = import.meta.env.VITE_FFUN_AUTH_SUPERTOKENS_API_BASE_PATH || "/supertokens";
14
14
  export const authSupertokensResendAfter = import.meta.env.VITE_FFUN_AUTH_SUPERTOKENS_RESEND_AFTER || 60 * 1000;
15
15
 
16
- export const sentryEnable = import.meta.env.VITE_FFUN_ENABLE_SENTRY == "True" || false;
17
-
18
- export const sentryDsn = import.meta.env.VITE_FFUN_SENTRY_DSN || "not-secified";
19
- export const sentrySampleRate = import.meta.env.VITE_FFUN_SENTRY_SAMPLE_RATE || 1.0;
20
-
21
16
  export const githubRepo = import.meta.env.VITE_FFUN_GITHUB_REPO || "https://github.com/Tiendil/feeds.fun";
22
17
 
23
18
  console.log("settings.appName", appName);
@@ -30,8 +25,4 @@ console.log("settings.authMode", authMode);
30
25
  console.log("settings.authSupertokensApiBasePath", authSupertokensApiBasePath);
31
26
  console.log("settings.authSupertokensResendAfter", authSupertokensResendAfter);
32
27
 
33
- console.log("settings.sentryEnable", sentryEnable);
34
- console.log("settings.sentryDsn", sentryDsn);
35
- console.log("settings.sentrySampleRate", sentrySampleRate);
36
-
37
28
  console.log("settings.githubRepo", githubRepo);
package/src/main.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import {createApp} from "vue";
2
2
  import {createPinia} from "pinia";
3
- import * as Sentry from "@sentry/vue";
4
3
 
5
4
  import App from "./App.vue";
6
5
  import router from "./router";
7
6
 
7
+ import "./style.css";
8
+
8
9
  import FeedsList from "./components/FeedsList.vue";
9
10
  import EntriesList from "./components/EntriesList.vue";
10
11
  import RulesList from "./components/RulesList.vue";
@@ -17,17 +18,20 @@ import RuleScoreUpdater from "./components/RuleScoreUpdater.vue";
17
18
  import TagsFilter from "./components/TagsFilter.vue";
18
19
  import DiscoveryForm from "./components/DiscoveryForm.vue";
19
20
  import FeedInfo from "./components/FeedInfo.vue";
20
- import EntryInfo from "./components/EntryInfo.vue";
21
21
  import OpmlUpload from "./components/OPMLUpload.vue";
22
22
  import FeedForList from "./components/FeedForList.vue";
23
23
  import SupertokensLogin from "./components/SupertokensLogin.vue";
24
24
  import FeedsCollections from "./components/FeedsCollections.vue";
25
- import FfunGithubButtons from "./components/FfunGithubButtons.vue";
26
25
  import FfunTag from "./components/FfunTag.vue";
27
26
  import SimplePagination from "./components/SimplePagination.vue";
28
27
  import UserSetting from "./components/UserSetting.vue";
29
28
  import OpenaiTokensUsage from "./components/OpenaiTokensUsage.vue";
30
29
  import FaviconElement from "./components/FaviconElement.vue";
30
+ import NotificationCollections from "./components/NotificationCollections.vue";
31
+ import NotificationOpenaiApiKey from "./components/NotificationOpenaiApiKey.vue";
32
+ import Notifications from "./components/Notifications.vue";
33
+ import RuleForList from "./components/RuleForList.vue";
34
+ import UserSettingForNotification from "./components/UserSettingForNotification.vue";
31
35
 
32
36
  import ScoreSelector from "./inputs/ScoreSelector.vue";
33
37
  import InputMarker from "./inputs/Marker.vue";
@@ -43,7 +47,6 @@ import SidePanelLayout from "./layouts/SidePanelLayout.vue";
43
47
  import {useSupertokens} from "@/stores/supertokens";
44
48
 
45
49
  import VueCountdown from "@chenfengyuan/vue-countdown";
46
- import GithubButton from "vue-github-button";
47
50
 
48
51
  const app = createApp(App);
49
52
 
@@ -59,17 +62,20 @@ app.component("RuleScoreUpdater", RuleScoreUpdater);
59
62
  app.component("TagsFilter", TagsFilter);
60
63
  app.component("DiscoveryForm", DiscoveryForm);
61
64
  app.component("FeedInfo", FeedInfo);
62
- app.component("EntryInfo", EntryInfo);
63
65
  app.component("OpmlUpload", OpmlUpload);
64
66
  app.component("FeedForList", FeedForList);
65
67
  app.component("SupertokensLogin", SupertokensLogin);
66
68
  app.component("FeedsCollections", FeedsCollections);
67
- app.component("FfunGithubButtons", FfunGithubButtons);
68
69
  app.component("FfunTag", FfunTag);
69
70
  app.component("SimplePagination", SimplePagination);
70
71
  app.component("UserSetting", UserSetting);
71
72
  app.component("OpenaiTokensUsage", OpenaiTokensUsage);
72
73
  app.component("FaviconElement", FaviconElement);
74
+ app.component("NotificationCollections", NotificationCollections);
75
+ app.component("NotificationOpenaiApiKey", NotificationOpenaiApiKey);
76
+ app.component("Notifications", Notifications);
77
+ app.component("RuleForList", RuleForList);
78
+ app.component("UserSettingForNotification", UserSettingForNotification);
73
79
 
74
80
  app.component("ScoreSelector", ScoreSelector);
75
81
  app.component("InputMarker", InputMarker);
@@ -83,23 +89,10 @@ app.component("WideLayout", WideLayout);
83
89
  app.component("SidePanelLayout", SidePanelLayout);
84
90
 
85
91
  app.component("vue-countdown", VueCountdown);
86
- app.component("github-button", GithubButton);
87
92
 
88
93
  app.use(createPinia());
89
94
  app.use(router);
90
95
 
91
- if (settings.sentryEnable) {
92
- Sentry.init({
93
- app,
94
- dsn: settings.sentryDsn,
95
- environment: settings.environment,
96
- sampleRate: settings.sentrySampleRate,
97
- attachStacktrace: true,
98
- enableTracing: false,
99
- integrations: []
100
- });
101
- }
102
-
103
96
  app.mount("#app");
104
97
 
105
98
  import * as api from "@/logic/api";
@@ -15,8 +15,6 @@ export const useEntriesStore = defineStore("entriesStore", () => {
15
15
  const entries = ref<{[key: t.EntryId]: t.Entry}>({});
16
16
  const requestedEntries = ref<{[key: t.EntryId]: boolean}>({});
17
17
 
18
- const firstTimeEntriesLoading = ref(true);
19
-
20
18
  function registerEntry(entry: t.Entry) {
21
19
  if (entry.id in entries.value) {
22
20
  if (entry.body === null && entries.value[entry.id].body !== null) {
@@ -50,10 +48,8 @@ export const useEntriesStore = defineStore("entriesStore", () => {
50
48
  report.push(entry.id);
51
49
  }
52
50
 
53
- firstTimeEntriesLoading.value = false;
54
-
55
51
  return report;
56
- }, []);
52
+ }, null);
57
53
 
58
54
  function requestFullEntry({entryId}: {entryId: t.EntryId}) {
59
55
  if (entryId in entries.value && entries.value[entryId].body !== null) {
@@ -104,7 +100,6 @@ export const useEntriesStore = defineStore("entriesStore", () => {
104
100
  requestFullEntry,
105
101
  setMarker,
106
102
  removeMarker,
107
- firstTimeEntriesLoading,
108
103
  loadedEntriesReport
109
104
  };
110
105
  });
package/src/style.css ADDED
@@ -0,0 +1,92 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ html {
7
+ @apply font-serif bg-slate-100;
8
+ }
9
+
10
+ h1 {
11
+ @apply text-3xl font-bold leading-tight my-4;
12
+ }
13
+
14
+ h2 {
15
+ @apply text-2xl font-semibold leading-relaxed my-3;
16
+ }
17
+
18
+ hr {
19
+ @apply border-slate-400 my-2;
20
+ }
21
+
22
+ p,
23
+ ul,
24
+ ol,
25
+ table {
26
+ @apply mb-1;
27
+ }
28
+
29
+ p a {
30
+ @apply text-blue-600 hover:text-blue-800 cursor-pointer;
31
+ }
32
+
33
+ .ffun-info-common {
34
+ @apply border-2 p-2 my-1 rounded;
35
+ }
36
+
37
+ .ffun-info-good {
38
+ @apply ffun-info-common border-green-300 bg-green-50;
39
+ }
40
+
41
+ .ffun-info-bad {
42
+ @apply ffun-info-common border-red-300 bg-red-50;
43
+ }
44
+
45
+ .ffun-info-warning {
46
+ @apply ffun-info-common border-orange-300 bg-orange-50;
47
+ }
48
+
49
+ .ffun-info-attention {
50
+ @apply ffun-info-common border-purple-300 bg-purple-50;
51
+ }
52
+
53
+ .ffun-header-link {
54
+ @apply text-blue-600 hover:text-blue-800 cursor-pointer text-lg;
55
+ }
56
+
57
+ .ffun-normal-link {
58
+ @apply text-blue-600 hover:text-blue-800 cursor-pointer;
59
+ }
60
+
61
+ .ffun-header-link-disabled {
62
+ @apply text-lg underline underline-offset-4;
63
+ }
64
+
65
+ .ffun-input-common {
66
+ @apply border-2 rounded bg-slate-50 hover:bg-blue-50 enabled:hover:border-blue-400 px-1 disabled:bg-orange-50;
67
+ }
68
+
69
+ .ffun-form-button {
70
+ @apply ffun-input-common border-blue-300 disabled:bg-blue-700/75 py-1;
71
+ }
72
+
73
+ .ffun-file-button {
74
+ @apply file:border-2 file:rounded file:bg-slate-50 file:hover:bg-blue-50 file:enabled:hover:border-blue-400 file:px-1 file:disabled:bg-orange-50 file:border-blue-300 file:disabled:bg-blue-700/75 file:py-1 file:shadow-none file:border-solid text-slate-500;
75
+ }
76
+
77
+ .ffun-config-flag {
78
+ @apply ffun-input-common border-blue-300 disabled:bg-blue-700/75 py-0;
79
+ }
80
+
81
+ .ffun-input {
82
+ @apply ffun-input-common border-blue-200 focus:border-blue-300 focus:outline-none placeholder-gray-500 py-1;
83
+ }
84
+
85
+ .ffun-checkbox {
86
+ @apply ffun-input-common h-4 w-4 align-middle;
87
+ }
88
+
89
+ .ffun-normalized-text ul {
90
+ @apply list-disc list-inside;
91
+ }
92
+ }
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div
3
- class="score"
3
+ class="inline-block cursor-pointer font-semibold text-purple-700"
4
4
  @click.prevent="onClick()">
5
5
  {{ value }}
6
6
  </div>
@@ -45,12 +45,3 @@
45
45
  alert(strings.join("\n"));
46
46
  }
47
47
  </script>
48
-
49
- <style scoped>
50
- .score {
51
- display: inline-block;
52
- cursor: pointer;
53
- padding: 0.1rem;
54
- background-color: #c1c1ff;
55
- }
56
- </style>
@@ -2,14 +2,10 @@
2
2
  <wide-layout>
3
3
  <template #header> Feeds Fun </template>
4
4
 
5
- <div v-if="!linkProcessed">Checking login status...</div>
5
+ <div class="ffun-info-good">
6
+ <p v-if="!linkProcessed">Checking login status...</p>
6
7
 
7
- <div v-else-if="globalState.isLoggedIn">
8
- <button @click="goToWorkspace()">Go To Feeds</button>
9
- </div>
10
-
11
- <div v-else>
12
- <supertokens-login />
8
+ <supertokens-login v-else />
13
9
  </div>
14
10
  </wide-layout>
15
11
  </template>
@@ -2,6 +2,8 @@
2
2
  <side-panel-layout :reload-button="false">
3
3
  <template #main-header> Collections </template>
4
4
 
5
+ <p> Try to subscribe for the feeds collections that we are preparing for you! </p>
6
+
5
7
  <feeds-collections />
6
8
  </side-panel-layout>
7
9
  </template>