@turnipxenon/pineapple 5.2.2 → 5.3.0-alpha.2

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/dist/assets/icons/cursor-chat.svg +46 -0
  2. package/dist/assets/icons/cursor-open-in-new.svg +8 -0
  3. package/dist/assets/icons/icon-open-in-new.svg +1 -0
  4. package/dist/components/dialog_manager/DialogManager.d.ts +8 -2
  5. package/dist/components/dialog_manager/DialogManager.d.ts.map +1 -1
  6. package/dist/components/dialog_manager/DialogManager.js +63 -11
  7. package/dist/components/dialog_manager/DialogManagerStore.d.ts +0 -3
  8. package/dist/components/dialog_manager/DialogManagerStore.d.ts.map +1 -1
  9. package/dist/components/dialog_manager/DialogManagerStore.js +1 -3
  10. package/dist/components/dialog_manager/DialogProcessor.d.ts.map +1 -1
  11. package/dist/components/dialog_manager/DialogProcessor.js +3 -2
  12. package/dist/components/dialog_manager/DialogUtils.js +2 -2
  13. package/dist/components/dialog_manager/IDialogManager.d.ts +4 -2
  14. package/dist/components/dialog_manager/IDialogManager.d.ts.map +1 -1
  15. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts +2 -1
  16. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.d.ts.map +1 -1
  17. package/dist/components/dialog_manager/behavior_tree/core/BTreeUtils.js +4 -3
  18. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts +2 -0
  19. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionArguments.d.ts.map +1 -1
  20. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts +4 -2
  21. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.d.ts.map +1 -1
  22. package/dist/components/dialog_manager/behavior_tree/expression/ExpressionEvaluator.js +8 -6
  23. package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.d.ts.map +1 -1
  24. package/dist/components/dialog_manager/behavior_tree/expression/OperandNode.js +1 -1
  25. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.d.ts.map +1 -1
  26. package/dist/components/dialog_manager/behavior_tree/expression/commands/VisitedCountCommand.js +1 -2
  27. package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts +2 -0
  28. package/dist/components/dialog_manager/behavior_tree/line_core/LineNodeArguments.d.ts.map +1 -1
  29. package/dist/components/dialog_manager/behavior_tree/line_processors/ElseIfNode.js +1 -1
  30. package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.d.ts.map +1 -1
  31. package/dist/components/dialog_manager/behavior_tree/line_processors/IfNode.js +1 -2
  32. package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.d.ts.map +1 -1
  33. package/dist/components/dialog_manager/behavior_tree/line_processors/NormalLineProcessorNode.js +2 -3
  34. package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.d.ts.map +1 -1
  35. package/dist/components/dialog_manager/behavior_tree/line_processors/SetVariableNode.js +2 -3
  36. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.d.ts.map +1 -1
  37. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/DeclareCommand.js +3 -2
  38. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts.map +1 -1
  39. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.js +3 -2
  40. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.d.ts.map +1 -1
  41. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/UnvisitCommand.js +2 -3
  42. package/dist/modules/parsnip/ParsnipBlockChildren.svelte +3 -0
  43. package/dist/modules/parsnip/ParsnipBlockChildren.svelte.d.ts.map +1 -1
  44. package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte +15 -3
  45. package/dist/modules/parsnip/ParsnipPhrasingChildren.svelte.d.ts.map +1 -1
  46. package/dist/modules/parsnip/external-images/ParsnipImage.svelte +111 -0
  47. package/dist/modules/parsnip/external-images/ParsnipImage.svelte.d.ts +9 -0
  48. package/dist/modules/parsnip/external-images/ParsnipImage.svelte.d.ts.map +1 -0
  49. package/dist/modules/parsnip/external-images/ParsnipImageCollection.svelte +62 -0
  50. package/dist/modules/parsnip/external-images/ParsnipImageCollection.svelte.d.ts +9 -0
  51. package/dist/modules/parsnip/external-images/ParsnipImageCollection.svelte.d.ts.map +1 -0
  52. package/dist/modules/parsnip/external-images/externalImages.remote.d.ts +8 -0
  53. package/dist/modules/parsnip/external-images/externalImages.remote.d.ts.map +1 -0
  54. package/dist/modules/parsnip/external-images/externalImages.remote.js +50 -0
  55. package/dist/modules/parsnip/route-util/ParsnipBlog.svelte +2 -1
  56. package/dist/modules/parsnip/route-util/ParsnipBlog.svelte.d.ts.map +1 -1
  57. package/dist/modules/parsnip/route-util/slugPageServerLoad.d.ts.map +1 -1
  58. package/dist/modules/parsnip/route-util/slugPageServerLoad.js +21 -0
  59. package/dist/scripts/pineapple_fiber/PineappleFiberParser.d.ts.map +1 -1
  60. package/dist/scripts/pineapple_fiber/PineappleFiberParser.js +19 -0
  61. package/dist/scripts/pineapple_fiber/TutorialBroken.yarn +143 -0
  62. package/dist/styles/app.css +30 -2
  63. package/dist/test/DialogTestUtility.d.ts +8 -0
  64. package/dist/test/DialogTestUtility.d.ts.map +1 -0
  65. package/dist/test/DialogTestUtility.js +62 -0
  66. package/dist/test/index.d.ts +3 -0
  67. package/dist/test/index.d.ts.map +1 -0
  68. package/dist/test/index.js +2 -0
  69. package/dist/types/pineapple_fiber/DialogDetail.d.ts +1 -0
  70. package/dist/types/pineapple_fiber/DialogDetail.d.ts.map +1 -1
  71. package/dist/types/pineapple_fiber/DialogVariableStore.d.ts.map +1 -1
  72. package/dist/types/pineapple_fiber/DialogVariableStore.js +41 -13
  73. package/dist/ui/elements/TextLink.svelte +1 -1
  74. package/dist/ui/elements/index.d.ts +1 -0
  75. package/dist/ui/elements/index.d.ts.map +1 -1
  76. package/dist/ui/elements/index.js +1 -0
  77. package/dist/ui/modules/NavigationMenu/NavigationControl.svelte +41 -10
  78. package/dist/ui/modules/NavigationMenu/NavigationControl.svelte.d.ts +3 -1
  79. package/dist/ui/modules/NavigationMenu/NavigationControl.svelte.d.ts.map +1 -1
  80. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte +131 -39
  81. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts +3 -1
  82. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts.map +1 -1
  83. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte +21 -21
  84. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts +1 -1
  85. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts.map +1 -1
  86. package/dist/ui/modules/universal-overlay/DialogPanel.svelte +80 -6
  87. package/dist/ui/modules/universal-overlay/DialogPanel.svelte.d.ts.map +1 -1
  88. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte +132 -75
  89. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts +4 -1
  90. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts.map +1 -1
  91. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte +0 -3
  92. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts.map +1 -1
  93. package/dist/ui/templates/blog_template/BlogTemplate.svelte +7 -1
  94. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte +33 -1
  95. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte.d.ts.map +1 -1
  96. package/dist/ui/templates/index.d.ts +1 -0
  97. package/dist/ui/templates/index.d.ts.map +1 -1
  98. package/dist/ui/templates/index.js +2 -0
  99. package/dist/util/context/PineappleBaseContext.svelte +6 -2
  100. package/dist/util/context/PineappleBaseContext.svelte.d.ts.map +1 -1
  101. package/dist/util/context/pineappleBaseContextDefinitions.svelte.d.ts +2 -0
  102. package/dist/util/context/pineappleBaseContextDefinitions.svelte.d.ts.map +1 -1
  103. package/dist/util/context/pineappleBaseContextDefinitions.svelte.js +2 -0
  104. package/dist/util/localStore.svelte.d.ts +2 -0
  105. package/dist/util/localStore.svelte.d.ts.map +1 -1
  106. package/dist/util/localStore.svelte.js +2 -0
  107. package/dist/yarn/Tutorial.yarn +141 -0
  108. package/package.json +12 -7
  109. package/src/lib/styles/app.css +30 -2
  110. package/dist/assets/icons/chat-cursor.svg +0 -47
@@ -11,19 +11,24 @@ TODO: delete GeneralSettingsModal.svelte
11
11
  import DarkIcon from "../../../assets/icons/icon-dark-mode.svg";
12
12
  import LightIcon from "../../../assets/icons/icon-light-mode.svg";
13
13
  import PineappleSwitch from "../../elements/PineappleSwitch.svelte";
14
+ import PinyaButton from "../../elements/PinyaButton/PinyaButton.svelte";
14
15
 
15
16
  import LanguagePicker from "../modals/general-settings/LanguagePicker.svelte";
16
17
  import { appState } from "../../templates/index";
17
18
  import {
19
+ getAutoScrollPrefContext,
18
20
  getEnableDialogPreferenceContext,
19
- getEnablePortraitContext
21
+ getEnablePortraitContext,
22
+ getTextSpeedContext
20
23
  } from "../../../util/context/pineappleBaseContextDefinitions.svelte";
21
24
  import { setMode, userPrefersMode } from "mode-watcher";
25
+ import TutorialYarn from "../../../yarn/Tutorial.yarn?raw";
26
+ import { dialogManager } from "../../../components/dialog_manager/DialogManager";
22
27
 
23
28
  interface ToggleItem {
24
- key: "light" | "dark" | "system"
25
- imageSrc: string,
26
- label: string,
29
+ key: "light" | "dark" | "system";
30
+ imageSrc: string;
31
+ label: string;
27
32
  }
28
33
 
29
34
  const modes: ToggleItem[] = [
@@ -32,13 +37,15 @@ TODO: delete GeneralSettingsModal.svelte
32
37
  { key: "system", imageSrc: ConstrastIcon, label: "System" }
33
38
  ];
34
39
 
40
+ let { close = undefined }: { close?: () => void } = $props();
41
+
35
42
  let selectedItem: ToggleItem = $state(modes[0]);
36
43
 
37
44
  // when mode is edited outside, adjust toggle button
38
45
  // do not use runes here because we only want explicit changes outside
39
46
  // our control here!
40
47
  userPrefersMode.subscribe((value) => {
41
- const si = modes.find(m => m.key === value);
48
+ const si = modes.find((m) => m.key === value);
42
49
  if (selectedItem !== si && si) {
43
50
  selectedItem = si;
44
51
  }
@@ -46,6 +53,29 @@ TODO: delete GeneralSettingsModal.svelte
46
53
 
47
54
  let enableDialogPreference = getEnableDialogPreferenceContext();
48
55
  let enablePortraitContext = getEnablePortraitContext();
56
+ let textSpeedContext = getTextSpeedContext();
57
+ let autoScrollPrefContext = getAutoScrollPrefContext();
58
+
59
+ let tutorialLoaded = $state(false);
60
+ const activateTutorial = () => {
61
+ const _tutorialLoaded = tutorialLoaded;
62
+ tutorialLoaded = false;
63
+ const currentDialogId = dialogManager.currentMessageMeta.dialogId;
64
+ if (currentDialogId && !currentDialogId.includes('Tutorial')) {
65
+ dialogManager.dialogVariableStore.setItem("$tutorialReturnAddress", currentDialogId);
66
+ }
67
+ if (!_tutorialLoaded) {
68
+ dialogManager.extendDialogTree(TutorialYarn, "TutorialStart").then(() => {
69
+ close?.();
70
+ dialogManager.enableDialog(true);
71
+ });
72
+ } else {
73
+ dialogManager.setDialogChoiceById("TutorialStart");
74
+ close?.();
75
+ dialogManager.enableDialog(true);
76
+
77
+ }
78
+ };
49
79
 
50
80
  // when mode is changed inside the button, adjust the mode
51
81
  $effect(() => {
@@ -74,18 +104,20 @@ TODO: delete GeneralSettingsModal.svelte
74
104
  type="button"
75
105
  title={mode.label}
76
106
  class={`btn pt-3 pb-3 hover:brightness-125
77
- ${mode.key === selectedItem.key ? 'selected bg-secondary-400 dark:bg-secondary-800' : 'preset-outlined-primary-300-700'}
107
+ ${mode.key === selectedItem.key ? "selected bg-secondary-400 dark:bg-secondary-800" : "preset-outlined-primary-300-700"}
78
108
  `}
79
- onclick={() => { setMode(mode.key) }}
109
+ onclick={() => {
110
+ setMode(mode.key);
111
+ }}
80
112
  >
81
113
  <img
82
114
  src={mode.imageSrc}
83
115
  aria-hidden="true"
84
116
  alt=""
85
117
  class={`icon
86
- ${mode.key === selectedItem.key ? 'reverse' : ''}
118
+ ${mode.key === selectedItem.key ? "reverse" : ""}
87
119
  `}
88
- >
120
+ />
89
121
  <div>
90
122
  {mode.label}
91
123
  </div>
@@ -99,84 +131,109 @@ TODO: delete GeneralSettingsModal.svelte
99
131
  {/if}
100
132
 
101
133
  {#if appState.allowDialog}
134
+ <h3>Dialog or conversation</h3>
102
135
  <div class="switch-default">
103
- <PineappleSwitch
104
- name="conversation-preference"
105
- bind:checked={enableDialogPreference.value}>
106
- </PineappleSwitch>
136
+ <PineappleSwitch name="conversation-preference" bind:checked={enableDialogPreference.value}
137
+ ></PineappleSwitch>
107
138
  <label for="conversation-preference">
108
139
  Conversation preference: {enableDialogPreference.value ? "Always on" : "Always off"}
109
140
  </label>
110
141
  </div>
111
142
  <div class="switch-default">
112
- <PineappleSwitch
113
- name="portrait-preference"
114
- bind:checked={enablePortraitContext.value}>
115
- </PineappleSwitch>
143
+ <PineappleSwitch name="portrait-preference" bind:checked={enablePortraitContext.value}
144
+ ></PineappleSwitch>
116
145
  <label for="portrait-preference">
117
146
  Show conversation portrait: {enablePortraitContext.value ? "Always on" : "Always off"}
118
147
  </label>
119
148
  </div>
149
+ <div class="switch-default">
150
+ <PineappleSwitch name="auto-scroll-preference" bind:checked={autoScrollPrefContext.value}
151
+ ></PineappleSwitch>
152
+ <label for="auto-scroll-preference">
153
+ Auto scroll conversations: {autoScrollPrefContext.value ? "On" : "Off"}
154
+ </label>
155
+ </div>
156
+ <div class="input-slider default-flex">
157
+ <label for="text-speed-input">Text speed {textSpeedContext.value}/10</label>
158
+ <input
159
+ bind:value={textSpeedContext.value}
160
+ id="text-speed-input"
161
+ type="range"
162
+ min="1"
163
+ max="10"
164
+ />
165
+ </div>
166
+ <PinyaButton onclick={activateTutorial}><span>Initiate conversation tutorial</span></PinyaButton
167
+ >
120
168
  {/if}
121
169
  </div>
122
170
 
123
171
  <style>
124
- :global {
125
- html {
126
- --primary-btn-color-selected: var(--color-secondary-400);
127
- }
128
-
129
- html.dark {
130
- --primary-btn-color-selected: var(--color-secondary-800);
131
- }
132
- }
133
-
134
- .actions {
135
- display: flex;
136
- flex-direction: row-reverse;
137
- margin-top: 1.4lh;
138
- }
139
-
140
- .wrapper {
141
- display: flex;
142
- flex-direction: column;
143
- justify-content: start;
144
- text-align: start;
145
- gap: 1lh;
146
- overflow-y: auto;
147
- font-size: var(--text-base);
148
- }
149
-
150
- #dark-mode-fieldset {
151
- legend {
152
- background: transparent;
153
- }
154
-
155
- #field-flex {
156
- display: flex;
157
- flex-wrap: wrap;
158
- gap: 1rem;
159
- padding: 0.25lh 1rem;
160
- }
161
-
162
- button {
163
- img {
164
- filter: invert(80%);
165
- }
166
- }
167
-
168
- button.selected {
169
- background-color: var(--primary-btn-color-selected);
170
-
171
- img {
172
- filter: unset;
173
- }
174
- }
175
- }
176
-
177
- .switch-default {
178
- display: flex;
179
- justify-items: center;
180
- gap: 1em;
181
- }
172
+ :global {
173
+ html {
174
+ --primary-btn-color-selected: var(--color-secondary-400);
175
+ }
176
+
177
+ html.dark {
178
+ --primary-btn-color-selected: var(--color-secondary-800);
179
+ }
180
+
181
+ .input-slider {
182
+ accent-color: var(--primary-btn-color-selected);
183
+ }
184
+ }
185
+
186
+ .actions {
187
+ display: flex;
188
+ flex-direction: row-reverse;
189
+ margin-top: 1.4lh;
190
+ }
191
+
192
+ .wrapper {
193
+ display: flex;
194
+ flex-direction: column;
195
+ justify-content: start;
196
+ text-align: start;
197
+ gap: 1lh;
198
+ overflow-y: auto;
199
+ font-size: var(--text-base);
200
+ margin: 0.5lh 0;
201
+ padding-top: 0.5lh;
202
+ padding-bottom: 1.6lh;
203
+ }
204
+
205
+ #dark-mode-fieldset {
206
+ legend {
207
+ background: transparent;
208
+ }
209
+
210
+ #field-flex {
211
+ display: flex;
212
+ flex-wrap: wrap;
213
+ gap: 1rem;
214
+ padding: 0.25lh 1rem;
215
+ }
216
+
217
+ button {
218
+ img {
219
+ filter: invert(80%);
220
+ }
221
+ }
222
+
223
+ button.selected {
224
+ background-color: var(--primary-btn-color-selected);
225
+
226
+ img {
227
+ filter: unset;
228
+ }
229
+ }
230
+ }
231
+
232
+ :global {
233
+ .switch-default {
234
+ display: flex;
235
+ justify-items: center;
236
+ gap: 1em;
237
+ }
238
+ }
182
239
  </style>
@@ -1,9 +1,12 @@
1
+ type $$ComponentProps = {
2
+ close?: () => void;
3
+ };
1
4
  /**
2
5
  * Layout and logic for Settings
3
6
  *
4
7
  * TODO: delete GeneralSettingsModal.svelte
5
8
  */
6
- declare const SettingsPanel: import("svelte").Component<Record<string, never>, {}, "">;
9
+ declare const SettingsPanel: import("svelte").Component<$$ComponentProps, {}, "">;
7
10
  type SettingsPanel = ReturnType<typeof SettingsPanel>;
8
11
  export default SettingsPanel;
9
12
  //# sourceMappingURL=SettingsPanel.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/universal-overlay/SettingsPanel.svelte.ts"],"names":[],"mappings":"AAyHA;;;;GAIG;AACH,QAAA,MAAM,aAAa,2DAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"SettingsPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/universal-overlay/SettingsPanel.svelte.ts"],"names":[],"mappings":"AA2BC,KAAK,gBAAgB,GAAI;IAAE,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AA6IjD;;;;GAIG;AACH,QAAA,MAAM,aAAa,sDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -120,8 +120,6 @@
120
120
  const filterSearchParams = (searchParams: URLSearchParams) => {
121
121
  // region Order
122
122
  const orderParam = searchParams.get("order")?.trim();
123
- console.log(searchParams);
124
- console.log(orderParam);
125
123
  if (orderParam) {
126
124
  actualLayout = [];
127
125
 
@@ -146,7 +144,6 @@
146
144
  });
147
145
 
148
146
  actualLayout = [...actualLayout];
149
- console.log(actualLayout);
150
147
  }
151
148
  // endregion
152
149
 
@@ -1 +1 @@
1
- {"version":3,"file":"SeaweedLayout.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/SeaweedLayout.svelte.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA0ThE,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"SeaweedLayout.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/SeaweedLayout.svelte.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAuThE,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -54,7 +54,7 @@
54
54
  </BlogTemplateInner>
55
55
  </div>
56
56
  {:else}
57
- <PinyaCard {includeDataNoSnippet} widthClass="max-w-4xl">
57
+ <PinyaCard {includeDataNoSnippet} widthClass="blog-template">
58
58
  <BlogTemplateInner pageMeta={pageMeta}>
59
59
  {@render children?.()}
60
60
  </BlogTemplateInner>
@@ -68,4 +68,10 @@
68
68
  padding-right: 2em;
69
69
  padding-left: 2em;
70
70
  }
71
+
72
+ :global(.blog-template) {
73
+ max-width: 64em;
74
+ width: 100%;
75
+ margin: auto;
76
+ }
71
77
  </style>
@@ -2,6 +2,7 @@
2
2
 
3
3
  <script lang="ts">
4
4
  import type { SimplePageMeta } from "../../modules/NavigationMenu/index";
5
+ import { localizeHref } from "../../../external/paraglide/runtime.js";
5
6
 
6
7
  interface Props {
7
8
  pageMeta: SimplePageMeta;
@@ -9,6 +10,13 @@
9
10
  }
10
11
 
11
12
  let { pageMeta, children }: Props = $props();
13
+
14
+ const getTagQueryHref = (tag: string): string => {
15
+ const query = new URLSearchParams();
16
+ query.set("index", "0");
17
+ query.append("tags", tag);
18
+ return `${localizeHref("/pineapple/")}?${query.toString()}`;
19
+ };
12
20
  </script>
13
21
 
14
22
  <article>
@@ -26,7 +34,7 @@
26
34
  <section id="article-tags">
27
35
  Tags:
28
36
  {#each pageMeta.tags as tag, index (index)}
29
- <span class="badge preset-filled">{tag}</span>
37
+ <a class="badge tag-link" href={getTagQueryHref(tag)}>{tag}</a>
30
38
  {/each}
31
39
  </section>
32
40
  {/if}
@@ -45,4 +53,28 @@
45
53
  .badge {
46
54
  margin-inline-end: 0.5em;
47
55
  }
56
+
57
+ #article-tags a.badge {
58
+ text-decoration: none;
59
+ }
60
+
61
+ #article-tags .tag-link {
62
+ display: inline-flex;
63
+ align-items: center;
64
+ border-radius: 0.5rem;
65
+ padding: 0.2rem 0.55rem;
66
+ border: 1px solid var(--color-surface-700-600);
67
+ background-color: transparent;
68
+ color: var(--color-surface-900-100);
69
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
70
+ }
71
+
72
+ #article-tags .tag-link:hover,
73
+ #article-tags .tag-link:focus-visible {
74
+ background-color: transparent;
75
+ border-color: var(--color-primary-400-600);
76
+ color: var(--color-surface-900-100);
77
+ outline: none;
78
+ filter: brightness(110%);
79
+ }
48
80
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"BlogTemplateInner.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/blog_template/BlogTemplateInner.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAG1E,UAAU,KAAK;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACpC;AAwCF,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"BlogTemplateInner.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/blog_template/BlogTemplateInner.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAI1E,UAAU,KAAK;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACpC;AAgDF,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -2,4 +2,5 @@ export { default as PinyaBase } from "./pinya-base/PinyaBase.svelte";
2
2
  export * from "./PinyaPageLayout";
3
3
  export * from "./SeaweedLayout";
4
4
  export * from "./confirmation-modal";
5
+ export declare const TutorialYarn: string;
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/templates/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAErE,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/templates/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAErE,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,eAAO,MAAM,YAAY,QAAgB,CAAC"}
@@ -1,4 +1,6 @@
1
+ import _TutorialYarn from "$pkg/yarn/Tutorial.yarn?raw";
1
2
  export { default as PinyaBase } from "./pinya-base/PinyaBase.svelte";
2
3
  export * from "./PinyaPageLayout";
3
4
  export * from "./SeaweedLayout";
4
5
  export * from "./confirmation-modal";
6
+ export const TutorialYarn = _TutorialYarn;
@@ -2,11 +2,13 @@
2
2
  import { enableUniversalOverlaySvelte4 } from "../..";
3
3
  import { appState } from "../../ui/templates/index";
4
4
  import {
5
+ setAutoScrollPrefContext,
5
6
  setEnableDialogOverlayContext,
6
7
  setEnableDialogPreferenceContext,
7
8
  setEnablePortraitContext,
8
9
  setIgnoreOverlayOverride,
9
- setOverlayTypeContext
10
+ setOverlayTypeContext,
11
+ setTextSpeedContext
10
12
  } from "./pineappleBaseContextDefinitions.svelte";
11
13
  import { createLocalStore } from "../localStore.svelte";
12
14
  import { onMount } from "svelte";
@@ -15,6 +17,8 @@
15
17
 
16
18
  setEnablePortraitContext(createLocalStore("enable-portrait"));
17
19
  setOverlayTypeContext(createLocalStore("overlay-type"));
20
+ setTextSpeedContext(createLocalStore("text-speed"));
21
+ setAutoScrollPrefContext(createLocalStore("auto-scroll-pref"));
18
22
 
19
23
  /**
20
24
  * how do we want to use this context???
@@ -30,7 +34,7 @@
30
34
  * c.setValue
31
35
  */
32
36
 
33
- // special logic since we would need to change the extensions for all the typescript code if we dont
37
+ // special logic since we would need to change the extensions for all the typescript code if we dont
34
38
  const enableDialogPrefStore = createLocalStore("enable-dialog-preference");
35
39
  setEnableDialogPreferenceContext(enableDialogPrefStore);
36
40
 
@@ -1 +1 @@
1
- {"version":3,"file":"PineappleBaseContext.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/util/context/PineappleBaseContext.svelte.ts"],"names":[],"mappings":"AAiFA,QAAA,MAAM,oBAAoB;cA7D8B,GAAG;UA6DO,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"PineappleBaseContext.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/util/context/PineappleBaseContext.svelte.ts"],"names":[],"mappings":"AAqFA,QAAA,MAAM,oBAAoB;cA/D8B,GAAG;UA+DO,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -17,6 +17,8 @@ export declare const getIgnoreOverlayOverride: () => {
17
17
  }) => {
18
18
  value: boolean;
19
19
  };
20
+ export declare const getTextSpeedContext: () => LocalStore<number>, setTextSpeedContext: (context: LocalStore<number>) => LocalStore<number>;
21
+ export declare const getAutoScrollPrefContext: () => LocalStore<boolean>, setAutoScrollPrefContext: (context: LocalStore<boolean>) => LocalStore<boolean>;
20
22
  export declare const getSiteLayout: () => PageMeta[], setSiteLayout: (context: PageMeta[]) => PageMeta[];
21
23
  /**
22
24
  * useful for on-start dialog appearance
@@ -1 +1 @@
1
- {"version":3,"file":"pineappleBaseContextDefinitions.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/util/context/pineappleBaseContextDefinitions.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,eAAO,MAAO,wBAAwB,6BAAE,wBAAwB,uDAAwC,CAAC;AACzG,eAAO,MAAO,gCAAgC,6BAAE,gCAAgC,uDAAwC,CAAC;AAIzH,eAAO,MAAO,6BAA6B;WAAyD,OAAO;GAA9D,6BAA6B;WAA0B,OAAO;;WAAP,OAAO;CAAI,CAAC;AAEhH,eAAO,MAAO,qBAAqB,iCAAE,qBAAqB,+DAA4C,CAAC;AACvG,eAAO,MAAO,wBAAwB;WAAqD,OAAO;GAA1D,wBAAwB;WAA2B,OAAO;;WAAP,OAAO;CAAK,CAAC;AACxG,eAAO,MAAO,aAAa,oBAAE,aAAa,qCAA+B,CAAC;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,SAI5C,CAAA"}
1
+ {"version":3,"file":"pineappleBaseContextDefinitions.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/util/context/pineappleBaseContextDefinitions.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,eAAO,MAAO,wBAAwB,6BAAE,wBAAwB,uDAAwC,CAAC;AACzG,eAAO,MAAO,gCAAgC,6BAAE,gCAAgC,uDAAwC,CAAC;AAIzH,eAAO,MAAO,6BAA6B;WAAyD,OAAO;GAA9D,6BAA6B;WAA0B,OAAO;;WAAP,OAAO;CAAI,CAAC;AAEhH,eAAO,MAAO,qBAAqB,iCAAE,qBAAqB,+DAA4C,CAAC;AACvG,eAAO,MAAO,wBAAwB;WAAqD,OAAO;GAA1D,wBAAwB;WAA2B,OAAO;;WAAP,OAAO;CAAK,CAAC;AACxG,eAAO,MAAO,mBAAmB,4BAAE,mBAAmB,qDAAuC,CAAC;AAC9F,eAAO,MAAO,wBAAwB,6BAAE,wBAAwB,uDAAwC,CAAC;AACzG,eAAO,MAAO,aAAa,oBAAE,aAAa,qCAA+B,CAAC;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,SAI5C,CAAA"}
@@ -8,6 +8,8 @@ export const [getEnableDialogPreferenceContext, setEnableDialogPreferenceContext
8
8
  export const [getEnableDialogOverlayContext, setEnableDialogOverlayContext] = createContext();
9
9
  export const [getOverlayTypeContext, setOverlayTypeContext] = createContext();
10
10
  export const [getIgnoreOverlayOverride, setIgnoreOverlayOverride] = createContext();
11
+ export const [getTextSpeedContext, setTextSpeedContext] = createContext();
12
+ export const [getAutoScrollPrefContext, setAutoScrollPrefContext] = createContext();
11
13
  export const [getSiteLayout, setSiteLayout] = createContext();
12
14
  /**
13
15
  * useful for on-start dialog appearance
@@ -12,6 +12,8 @@ export interface LocalStoreRestriction {
12
12
  "enable-portrait": boolean;
13
13
  "enable-dialog-preference": boolean;
14
14
  "overlay-type": OverlayType;
15
+ "text-speed": number;
16
+ "auto-scroll-pref": boolean;
15
17
  }
16
18
  export declare const createLocalStore: <k extends keyof LocalStoreRestriction>(key: k) => LocalStore<Readonly<LocalStoreRestriction>[k]>;
17
19
  //# sourceMappingURL=localStore.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localStore.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/util/localStore.svelte.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAOxC,qBAAa,UAAU,CAAC,CAAC;IACxB,KAAK,EAAkB,CAAC,CAAC;IACzB,GAAG,SAAM;IACT,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvG,YAAY,EAAE,CAAC,CAAC;gBAEJ,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAmCxC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAQ3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;CAc5B;AAED,MAAM,WAAW,qBAAqB;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0BAA0B,EAAE,OAAO,CAAC;IACpC,cAAc,EAAE,WAAW,CAAC;CAC5B;AAQD,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,MAAM,qBAAqB,EAAE,KAAK,CAAC,mDAE7E,CAAC"}
1
+ {"version":3,"file":"localStore.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/util/localStore.svelte.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAOxC,qBAAa,UAAU,CAAC,CAAC;IACxB,KAAK,EAAkB,CAAC,CAAC;IACzB,GAAG,SAAM;IACT,SAAS,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvG,YAAY,EAAE,CAAC,CAAC;gBAEJ,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAmCxC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM;IAQ3B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;CAc5B;AAED,MAAM,WAAW,qBAAqB;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0BAA0B,EAAE,OAAO,CAAC;IACpC,cAAc,EAAE,WAAW,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAUD,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,MAAM,qBAAqB,EAAE,KAAK,CAAC,mDAE7E,CAAC"}
@@ -62,6 +62,8 @@ const localStoreDefault = {
62
62
  "enable-portrait": true,
63
63
  "enable-dialog-preference": true,
64
64
  "overlay-type": 'dialog',
65
+ "text-speed": 9,
66
+ "auto-scroll-pref": true,
65
67
  };
66
68
  export const createLocalStore = (key) => {
67
69
  return new LocalStore(key, localStoreDefault[key]);
@@ -0,0 +1,141 @@
1
+ title: TutorialSetup
2
+ position: 50,-152
3
+ ---
4
+ Portrait: AresNeutral
5
+ <<declare $tutorialReturnAddress = "" as string>>
6
+ ===
7
+ title: TutorialStart
8
+ position: 50,31
9
+ ---
10
+ Portrait: AresHappy
11
+ <p><b>Hello!</b> If you're here, I'm assuming you want to learn more how to use <i>conversations</i>.
12
+ This is a <i>dialog box</i>.</p>
13
+ <p>Texts within <i>dialog boxes</i> are <i>scrollable</i> so please <i>scroll</i> if this text overflows.</p>
14
+ <p>Below are <i>choices</i> you can <i>click</i>. Please <b>click</b> them to see what the next dialogs look like.</p>
15
+
16
+ <choice Continue>Click me to proceed to the next dialog</choice>
17
+ <ChoiceBreak>
18
+
19
+ -> Continue
20
+ <<jump TutorialStart2>>
21
+ ===
22
+ title: TutorialStart2
23
+ position: 51,244
24
+ ---
25
+ Portrait: AresNeutral
26
+ <<unvisit TutorialChoiceA>>
27
+ <<unvisit TutorialChoiceB>>
28
+ <p>You can see that <i>choices</i> are indicated with this image <img src="/yarn/icon-chat.svg" alt="dialog-icon"/>.</p>
29
+ <p>Click any of the links that proceed the image <img src="/yarn/icon-chat.svg" alt="dialog-icon"/>.</p>
30
+
31
+ <choice TutorialChoiceA>Let's go to tutorial A</choice> | <choice TutorialChoiceB>Let's go to tutorial B</choice>
32
+ <ChoiceBreak>
33
+
34
+ -> TutorialChoiceA
35
+ <<jump TutorialChoiceA>>
36
+ -> TutorialChoiceB
37
+ <<jump TutorialChoiceB>>
38
+ ===
39
+ title: TutorialChoiceA
40
+ position: 316,535
41
+ ---
42
+ Portrait: AresHappy
43
+ <p>Click anywhere in the <i>dialog box</i> to instantly make the text appear. Sometimes, you may want to speed up the text.</p>
44
+ <p>This is <i>dialog</i> for choice A!</p>
45
+ <<if visited("TutorialChoiceB")>>
46
+ <choice TutorialMerge>Continue</choice>
47
+ <<else>>
48
+ <choice TutorialChoiceB>Continue</choice>
49
+ <<endif>>
50
+ <ChoiceBreak>
51
+
52
+ -> TutorialChoiceB
53
+ <<jump TutorialChoiceB>>
54
+ -> TutorialMerge
55
+ <<jump TutorialMerge>>
56
+ ===
57
+ title: TutorialChoiceB
58
+ position: -191,497
59
+ ---
60
+ Portrait: AresYay
61
+ <p>Welcome to Choice B!</p>
62
+ <p>Sometimes, I'll post links in the dialog. You'll see that <i>external links</i> are proceeded with this image <img src="/yarn/icon-open-in-new.svg" alt="external link icon"/>.</p>
63
+ <p>Clicking any of these <i>external links</i> will send you to a new tab with the link. You can <b>hover</b> on the link, and watch on the <i>bottom corner left of your browser</i> to see where the <i>external link</i> will lead you to.</p>
64
+ <p><a target="_blank" class="external-link" href="http://crouton.net">Check out this external link!</a></p>
65
+ <<if visited("TutorialChoiceA")>>
66
+ <choice TutorialMerge>Continue</choice>
67
+ <<else>>
68
+ <choice TutorialChoiceA>Continue</choice>
69
+ <<endif>>
70
+ <ChoiceBreak>
71
+
72
+ -> TutorialChoiceA
73
+ <<jump TutorialChoiceA>>
74
+ -> TutorialMerge
75
+ <<jump TutorialMerge>>
76
+ ===
77
+ title: TutorialMerge
78
+ ---
79
+ Portrait: AresSurprised
80
+ <p>Just like opportunities and <i>external links</i>, <choice Continue>choices</choice> can appear anywhere!</p>
81
+ <p>It can appear <choice Continue>here</choice>, <choice Continue>there</choice>, and <choice Continue>everywhere!</choice></p>
82
+ <ChoiceBreak>
83
+
84
+ -> Continue
85
+ <<jump TutorialChoicesResult>>
86
+ ===
87
+ title: TutorialChoicesResult
88
+ ---
89
+ Portrait: AresDisappointed
90
+ <p>Just like life, I've sadly given you an illusion of <i>choice</i> since all those <i>choices</i> only lead to one outcome.
91
+ <i>This particular dialog.</i></p>
92
+ <choice Continue>Anyways...</choice>
93
+ <ChoiceBreak>
94
+
95
+ -> Continue
96
+ <<jump TutorialSettings>>
97
+ ===
98
+ title: TutorialSettings
99
+ ---
100
+ Portrait: AresMad
101
+ <p>Feel free to check out the <i>Settings</i> menu by clicking the iconic <i>gear icon</i> on this dialog or on the top right of the page. You can...</p>
102
+ <ul>
103
+ <li>Keep this pesky <i>dialog box</i> away all the time!</li>
104
+ <li>Make the <i>portrait</i> of this ugly character disappear!</li>
105
+ <li>Make the <i>text speed</i> faster</li>
106
+ <li>Disable <i>auto scroll</i></li>
107
+ </ul>
108
+ <br>
109
+ <choice Continue>One last thing...</choice>
110
+ <ChoiceBreak>
111
+
112
+ -> Continue
113
+ <<jump TutorialDialogToggle>>
114
+ ===
115
+ title: TutorialDialogToggle
116
+ ---
117
+ Portrait: AresNeutral
118
+ <p>You can toggle (open or close) the dialog by clicking the <img src="/yarn/icon-chat.svg" alt="dialog-icon"/> icon at the top right,
119
+ or click the close button on this <i>dialog box</i>.</p>
120
+ <p>Try it out! You won't lose progress of our conversation.</p>
121
+ <choice Continue>And...</choice>
122
+ <ChoiceBreak>
123
+
124
+ -> Continue
125
+ <<jump TutorialEnd>>
126
+ ===
127
+ title: TutorialEnd
128
+ ---
129
+ Portrait: AresLetsGo
130
+ <p>And that covers everything you need to know. <b>^^</b></p>
131
+ <<if $tutorialReturnAddress != "">>
132
+ <choice Return>Return</choice> |
133
+ <<endif>>
134
+ <choice Redo>Redo tutorial</choice>
135
+ <ChoiceBreak>
136
+
137
+ -> Return
138
+ <<jump {$tutorialReturnAddress}>>
139
+ -> Redo
140
+ <<jump TutorialStart>>
141
+ ===