@communitiesuk/svelte-component-library 0.1.17

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 (217) hide show
  1. package/README.md +188 -0
  2. package/dist/assets/css/govuk-frontend.min.css +2 -0
  3. package/dist/assets/css/govuk-frontend.min.css.map +1 -0
  4. package/dist/assets/fonts/bold-affa96571d-v2.woff +0 -0
  5. package/dist/assets/fonts/bold-b542beb274-v2.woff2 +0 -0
  6. package/dist/assets/fonts/light-94a07e06a1-v2.woff2 +0 -0
  7. package/dist/assets/fonts/light-f591b13f7d-v2.woff +0 -0
  8. package/dist/assets/govuk_publishing_components/images/icon-autocomplete-search-suggestion.svg +4 -0
  9. package/dist/assets/govuk_publishing_components/images/icon-close.svg +1 -0
  10. package/dist/assets/images/favicon.ico +0 -0
  11. package/dist/assets/images/favicon.svg +1 -0
  12. package/dist/assets/images/govuk-crest-2x.png +0 -0
  13. package/dist/assets/images/govuk-crest.png +0 -0
  14. package/dist/assets/images/govuk-crest.svg +1 -0
  15. package/dist/assets/images/govuk-icon-180.png +0 -0
  16. package/dist/assets/images/govuk-icon-192.png +0 -0
  17. package/dist/assets/images/govuk-icon-512.png +0 -0
  18. package/dist/assets/images/govuk-icon-mask.svg +1 -0
  19. package/dist/assets/images/govuk-opengraph-image.png +0 -0
  20. package/dist/assets/images/homepage-illustration.svg +1 -0
  21. package/dist/assets/images/homepage.svg +44 -0
  22. package/dist/assets/images/masthead-illustration.svg +123 -0
  23. package/dist/assets/images/oflog_crest_black.png +0 -0
  24. package/dist/assets/images/oflog_crest_white.png +0 -0
  25. package/dist/assets/images/undraw_approved-wireframe_odf4.svg +1 -0
  26. package/dist/assets/images/undraw_collaborators_rgw4.svg +1 -0
  27. package/dist/assets/images/undraw_content-creator_vuqg.svg +1 -0
  28. package/dist/assets/images/undraw_online-media_opxh.svg +1 -0
  29. package/dist/assets/images/undraw_pull-request_zlsu.svg +1 -0
  30. package/dist/assets/images/undraw_reviewed-docs_g0cg.svg +1 -0
  31. package/dist/components/FilterPanel/codeBlocks.d.ts +3 -0
  32. package/dist/components/FilterPanel/codeBlocks.js +418 -0
  33. package/dist/components/content/InsetText.svelte +21 -0
  34. package/dist/components/content/InsetText.svelte.d.ts +7 -0
  35. package/dist/components/content/WarningText.svelte +27 -0
  36. package/dist/components/content/WarningText.svelte.d.ts +8 -0
  37. package/dist/components/data-vis/axis/Axis.svelte +51 -0
  38. package/dist/components/data-vis/axis/Axis.svelte.d.ts +33 -0
  39. package/dist/components/data-vis/axis/Ticks.svelte +113 -0
  40. package/dist/components/data-vis/axis/Ticks.svelte.d.ts +33 -0
  41. package/dist/components/data-vis/line-chart/Line.svelte +150 -0
  42. package/dist/components/data-vis/line-chart/Line.svelte.d.ts +85 -0
  43. package/dist/components/data-vis/line-chart/LineChart.svelte +249 -0
  44. package/dist/components/data-vis/line-chart/LineChart.svelte.d.ts +73 -0
  45. package/dist/components/data-vis/line-chart/Lines.svelte +138 -0
  46. package/dist/components/data-vis/line-chart/Lines.svelte.d.ts +57 -0
  47. package/dist/components/data-vis/line-chart/Marker.svelte +61 -0
  48. package/dist/components/data-vis/line-chart/Marker.svelte.d.ts +37 -0
  49. package/dist/components/data-vis/line-chart/SeriesLabel.svelte +67 -0
  50. package/dist/components/data-vis/line-chart/SeriesLabel.svelte.d.ts +43 -0
  51. package/dist/components/data-vis/line-chart/ValueLabel.svelte +50 -0
  52. package/dist/components/data-vis/line-chart/ValueLabel.svelte.d.ts +25 -0
  53. package/dist/components/data-vis/map/Map.svelte +392 -0
  54. package/dist/components/data-vis/map/Map.svelte.d.ts +47 -0
  55. package/dist/components/data-vis/map/MapLegend.svelte +41 -0
  56. package/dist/components/data-vis/map/MapLegend.svelte.d.ts +15 -0
  57. package/dist/components/data-vis/map/NonStandardControls.svelte +42 -0
  58. package/dist/components/data-vis/map/NonStandardControls.svelte.d.ts +13 -0
  59. package/dist/components/data-vis/map/Tooltip.svelte +41 -0
  60. package/dist/components/data-vis/map/Tooltip.svelte.d.ts +19 -0
  61. package/dist/components/data-vis/map/colorbrewer.d.ts +337 -0
  62. package/dist/components/data-vis/map/colorbrewer.js +1523 -0
  63. package/dist/components/data-vis/map/colors.d.ts +13 -0
  64. package/dist/components/data-vis/map/colors.js +65 -0
  65. package/dist/components/data-vis/map/dataJoin.d.ts +2 -0
  66. package/dist/components/data-vis/map/dataJoin.js +27 -0
  67. package/dist/components/data-vis/map/fullTopo.json +1 -0
  68. package/dist/components/data-vis/map/jenks.d.ts +1 -0
  69. package/dist/components/data-vis/map/jenks.js +51 -0
  70. package/dist/components/data-vis/map/lad2023.json +1 -0
  71. package/dist/components/data-vis/map/mapUtils.d.ts +5 -0
  72. package/dist/components/data-vis/map/mapUtils.js +86 -0
  73. package/dist/components/data-vis/map/topo.json +1 -0
  74. package/dist/components/data-vis/table/Table.svelte +247 -0
  75. package/dist/components/data-vis/table/Table.svelte.d.ts +19 -0
  76. package/dist/components/layout/Breadcrumbs.svelte +191 -0
  77. package/dist/components/layout/Breadcrumbs.svelte.d.ts +24 -0
  78. package/dist/components/layout/Footer.svelte +171 -0
  79. package/dist/components/layout/Footer.svelte.d.ts +30 -0
  80. package/dist/components/layout/Header.svelte +43 -0
  81. package/dist/components/layout/Header.svelte.d.ts +7 -0
  82. package/dist/components/layout/InternalHeader.svelte +628 -0
  83. package/dist/components/layout/InternalHeader.svelte.d.ts +15 -0
  84. package/dist/components/layout/PhaseBanner.svelte +28 -0
  85. package/dist/components/layout/PhaseBanner.svelte.d.ts +9 -0
  86. package/dist/components/layout/ServiceNavigation.svelte +143 -0
  87. package/dist/components/layout/ServiceNavigation.svelte.d.ts +13 -0
  88. package/dist/components/layout/SideNavigation.svelte +345 -0
  89. package/dist/components/layout/SideNavigation.svelte.d.ts +25 -0
  90. package/dist/components/layout/service-navigation-nested-mobile/HeaderNav.svelte +91 -0
  91. package/dist/components/layout/service-navigation-nested-mobile/HeaderNav.svelte.d.ts +15 -0
  92. package/dist/components/layout/service-navigation-nested-mobile/MobileNav.svelte +233 -0
  93. package/dist/components/layout/service-navigation-nested-mobile/MobileNav.svelte.d.ts +27 -0
  94. package/dist/components/layout/service-navigation-nested-mobile/ServiceNavigationNestedMobile.svelte +70 -0
  95. package/dist/components/layout/service-navigation-nested-mobile/ServiceNavigationNestedMobile.svelte.d.ts +11 -0
  96. package/dist/components/layout/service-navigation-nested-mobile/SideNav.svelte +276 -0
  97. package/dist/components/layout/service-navigation-nested-mobile/SideNav.svelte.d.ts +22 -0
  98. package/dist/components/ui/Accordion.svelte +244 -0
  99. package/dist/components/ui/Accordion.svelte.d.ts +23 -0
  100. package/dist/components/ui/Breadcrumbs.svelte +198 -0
  101. package/dist/components/ui/Breadcrumbs.svelte.d.ts +24 -0
  102. package/dist/components/ui/Button.svelte +96 -0
  103. package/dist/components/ui/Button.svelte.d.ts +17 -0
  104. package/dist/components/ui/CheckBox.svelte +198 -0
  105. package/dist/components/ui/CheckBox.svelte.d.ts +27 -0
  106. package/dist/components/ui/ContentsList.svelte +1117 -0
  107. package/dist/components/ui/ContentsList.svelte.d.ts +25 -0
  108. package/dist/components/ui/DateInput.svelte +255 -0
  109. package/dist/components/ui/DateInput.svelte.d.ts +59 -0
  110. package/dist/components/ui/Details.svelte +12 -0
  111. package/dist/components/ui/Details.svelte.d.ts +13 -0
  112. package/dist/components/ui/FilterPanel.svelte +588 -0
  113. package/dist/components/ui/FilterPanel.svelte.d.ts +74 -0
  114. package/dist/components/ui/Footer.svelte +171 -0
  115. package/dist/components/ui/Footer.svelte.d.ts +30 -0
  116. package/dist/components/ui/Header.svelte +43 -0
  117. package/dist/components/ui/Header.svelte.d.ts +7 -0
  118. package/dist/components/ui/Masthead.svelte +267 -0
  119. package/dist/components/ui/Masthead.svelte.d.ts +12 -0
  120. package/dist/components/ui/NavigationExample.svelte +117 -0
  121. package/dist/components/ui/NavigationExample.svelte.d.ts +3 -0
  122. package/dist/components/ui/NotificationBanner.svelte +93 -0
  123. package/dist/components/ui/NotificationBanner.svelte.d.ts +15 -0
  124. package/dist/components/ui/Radios.svelte +176 -0
  125. package/dist/components/ui/Radios.svelte.d.ts +28 -0
  126. package/dist/components/ui/RelatedContent.svelte +596 -0
  127. package/dist/components/ui/RelatedContent.svelte.d.ts +29 -0
  128. package/dist/components/ui/Search.svelte +499 -0
  129. package/dist/components/ui/Search.svelte.d.ts +32 -0
  130. package/dist/components/ui/SearchAutocomplete.svelte +655 -0
  131. package/dist/components/ui/SearchAutocomplete.svelte.d.ts +37 -0
  132. package/dist/components/ui/Select.svelte +116 -0
  133. package/dist/components/ui/Select.svelte.d.ts +22 -0
  134. package/dist/components/ui/ServiceNavigation.svelte +143 -0
  135. package/dist/components/ui/ServiceNavigation.svelte.d.ts +13 -0
  136. package/dist/components/ui/SideNavigation.svelte +346 -0
  137. package/dist/components/ui/SideNavigation.svelte.d.ts +25 -0
  138. package/dist/components/ui/Tabs.svelte +306 -0
  139. package/dist/components/ui/Tabs.svelte.d.ts +18 -0
  140. package/dist/components/ui/WhatsNew.svelte +155 -0
  141. package/dist/components/ui/WhatsNew.svelte.d.ts +29 -0
  142. package/dist/config.d.ts +51 -0
  143. package/dist/config.js +44 -0
  144. package/dist/icons/DoubleChevronButton.svelte +62 -0
  145. package/dist/icons/DoubleChevronButton.svelte.d.ts +13 -0
  146. package/dist/icons/IconSearch.svelte +42 -0
  147. package/dist/icons/IconSearch.svelte.d.ts +6 -0
  148. package/dist/icons/SingleChevronButtonWithLabel.svelte +132 -0
  149. package/dist/icons/SingleChevronButtonWithLabel.svelte.d.ts +19 -0
  150. package/dist/index.d.ts +44 -0
  151. package/dist/index.js +45 -0
  152. package/dist/main.css +1 -0
  153. package/dist/package-wrapping/BaseInformation.svelte +82 -0
  154. package/dist/package-wrapping/BaseInformation.svelte.d.ts +15 -0
  155. package/dist/package-wrapping/BaseNameAndStatus.svelte +108 -0
  156. package/dist/package-wrapping/BaseNameAndStatus.svelte.d.ts +10 -0
  157. package/dist/package-wrapping/CodeBlock.svelte +62 -0
  158. package/dist/package-wrapping/CodeBlock.svelte.d.ts +12 -0
  159. package/dist/package-wrapping/ComponentDemo.svelte +114 -0
  160. package/dist/package-wrapping/ComponentDemo.svelte.d.ts +25 -0
  161. package/dist/package-wrapping/ComponentDemoTEMP.svelte +305 -0
  162. package/dist/package-wrapping/ComponentDemoTEMP.svelte.d.ts +21 -0
  163. package/dist/package-wrapping/ComponentDetails.svelte +123 -0
  164. package/dist/package-wrapping/ComponentDetails.svelte.d.ts +13 -0
  165. package/dist/package-wrapping/DividerLine.svelte +21 -0
  166. package/dist/package-wrapping/DividerLine.svelte.d.ts +17 -0
  167. package/dist/package-wrapping/InputForParameter.svelte +205 -0
  168. package/dist/package-wrapping/InputForParameter.svelte.d.ts +13 -0
  169. package/dist/package-wrapping/InputForParameterUpdated.svelte +222 -0
  170. package/dist/package-wrapping/InputForParameterUpdated.svelte.d.ts +17 -0
  171. package/dist/package-wrapping/InputForParameterUpdatedTEMP.svelte +203 -0
  172. package/dist/package-wrapping/InputForParameterUpdatedTEMP.svelte.d.ts +17 -0
  173. package/dist/package-wrapping/ListOfComponentStatuses.svelte +19 -0
  174. package/dist/package-wrapping/ListOfComponentStatuses.svelte.d.ts +11 -0
  175. package/dist/package-wrapping/OverlayAndComponentContainer.svelte +426 -0
  176. package/dist/package-wrapping/OverlayAndComponentContainer.svelte.d.ts +33 -0
  177. package/dist/package-wrapping/ParametersSection.svelte +235 -0
  178. package/dist/package-wrapping/ParametersSection.svelte.d.ts +19 -0
  179. package/dist/package-wrapping/ParsingErrorToastsContainer.svelte +50 -0
  180. package/dist/package-wrapping/ParsingErrorToastsContainer.svelte.d.ts +15 -0
  181. package/dist/package-wrapping/Pill.svelte +54 -0
  182. package/dist/package-wrapping/Pill.svelte.d.ts +25 -0
  183. package/dist/package-wrapping/PlaygroundDetails.svelte +106 -0
  184. package/dist/package-wrapping/PlaygroundDetails.svelte.d.ts +13 -0
  185. package/dist/package-wrapping/ScreenSizeRadio.svelte +24 -0
  186. package/dist/package-wrapping/ScreenSizeRadio.svelte.d.ts +11 -0
  187. package/dist/package-wrapping/ScreenSizeRadioUpdated.svelte +23 -0
  188. package/dist/package-wrapping/ScreenSizeRadioUpdated.svelte.d.ts +11 -0
  189. package/dist/package-wrapping/SidebarContainer.svelte +103 -0
  190. package/dist/package-wrapping/SidebarContainer.svelte.d.ts +23 -0
  191. package/dist/package-wrapping/WrapperDetailsUpdate.svelte +40 -0
  192. package/dist/package-wrapping/WrapperDetailsUpdate.svelte.d.ts +15 -0
  193. package/dist/package-wrapping/templates/Template.svelte +100 -0
  194. package/dist/package-wrapping/templates/Template.svelte.d.ts +25 -0
  195. package/dist/templates/ComponentPageTemplate.svelte +1 -0
  196. package/dist/templates/ComponentPageTemplate.svelte.d.ts +26 -0
  197. package/dist/utils/data-transformations/convertCSV.d.ts +2 -0
  198. package/dist/utils/data-transformations/convertCSV.js +22 -0
  199. package/dist/utils/data-transformations/getValueFromParametersArray.d.ts +1 -0
  200. package/dist/utils/data-transformations/getValueFromParametersArray.js +9 -0
  201. package/dist/utils/layoutNavHelpers.d.ts +70 -0
  202. package/dist/utils/layoutNavHelpers.js +129 -0
  203. package/dist/utils/package-wrapping-specific/addIndexAndInitialValue.d.ts +1 -0
  204. package/dist/utils/package-wrapping-specific/addIndexAndInitialValue.js +21 -0
  205. package/dist/utils/package-wrapping-specific/createBindableParametersValuesArray.d.ts +1 -0
  206. package/dist/utils/package-wrapping-specific/createBindableParametersValuesArray.js +12 -0
  207. package/dist/utils/package-wrapping-specific/createParametersObject.d.ts +1 -0
  208. package/dist/utils/package-wrapping-specific/createParametersObject.js +29 -0
  209. package/dist/utils/package-wrapping-specific/defineDefaultEventHandler.d.ts +1 -0
  210. package/dist/utils/package-wrapping-specific/defineDefaultEventHandler.js +14 -0
  211. package/dist/utils/package-wrapping-specific/trackVisibleParameters.d.ts +1 -0
  212. package/dist/utils/package-wrapping-specific/trackVisibleParameters.js +29 -0
  213. package/dist/utils/syntax-highlighting/shikiHighlight.d.ts +7 -0
  214. package/dist/utils/syntax-highlighting/shikiHighlight.js +76 -0
  215. package/dist/utils/text-string-conversion/textStringConversion.d.ts +9 -0
  216. package/dist/utils/text-string-conversion/textStringConversion.js +86 -0
  217. package/package.json +113 -0
@@ -0,0 +1,205 @@
1
+ <script>
2
+ import loader from "@monaco-editor/loader";
3
+ import Pill from "./Pill.svelte";
4
+ import CodeBlock from "./CodeBlock.svelte";
5
+ import { propPillLookup } from "../config.js";
6
+ import {
7
+ Checkbox,
8
+ Input,
9
+ Modal,
10
+ Radio,
11
+ Select,
12
+ Textarea,
13
+ Button,
14
+ } from "flowbite-svelte";
15
+
16
+ let { source, value = $bindable() } = $props();
17
+
18
+ let propPillObject =
19
+ propPillLookup[source.isBindable ? "bindable" : source.isProp];
20
+
21
+ // Reference to the div element that will contain the editor
22
+ // Using $state() because Monaco will dynamically modify this element's contents
23
+ // and we want Svelte to track these DOM mutations
24
+ let editorContainer = $state();
25
+
26
+ // The actual Monaco editor instance that provides editing functionality
27
+ // This is separate from the container - Monaco will inject its UI into the container
28
+ // when initialized
29
+ let monacoEditor;
30
+
31
+ let defaultModal = $state(false);
32
+
33
+ async function createModal() {
34
+ defaultModal = true;
35
+
36
+ if (source.inputType === "function" || source.inputType === "javascript") {
37
+ // Load the Monaco editor library
38
+ const monaco = await loader.init();
39
+
40
+ monacoEditor = monaco.editor.create(editorContainer, {
41
+ value, // Initial editor content bound to the component's value prop
42
+ language: source.inputType === "javascript" ? "json" : "javascript",
43
+ theme: "vs-light",
44
+ minimap: { enabled: false },
45
+ scrollbar: {
46
+ verticalScrollbarSize: 8,
47
+ },
48
+ lineNumbers: "off",
49
+ folding: false,
50
+ scrollBeyondLastLine: false,
51
+ automaticLayout: true,
52
+ fontSize: 14,
53
+ formatOnPaste: true,
54
+ formatOnType: true,
55
+ wordWrap: "on",
56
+ overviewRulerLanes: 0, // Disables the overview ruler
57
+ overviewRulerBorder: false,
58
+ });
59
+
60
+ // Establish two-way data binding between editor content and component's value prop
61
+ monacoEditor.onDidChangeModelContent(() => {
62
+ value = monacoEditor.getValue();
63
+ });
64
+
65
+ // Cleanup: Dispose Monaco editor instance on component destruction
66
+ return () => {
67
+ monacoEditor?.dispose();
68
+ };
69
+ }
70
+ }
71
+ </script>
72
+
73
+ {#snippet parameterName(name, propPillObject, inline = false, modal = false)}
74
+ <div class="flex flex-row flex-wrap justify-between items=center">
75
+ <div class="flex flex-row flex-wrap gap-1 mb-{inline ? 0 : 1} items-center">
76
+ <p class="m-0 p-0 text-lg text-black italic" style="font-weight: 500;">
77
+ {source.name}
78
+ </p>
79
+ <Pill
80
+ size={propPillObject.size}
81
+ textContent={propPillObject.text}
82
+ bgColor={propPillObject.bgColor}
83
+ textColor={propPillObject.textColor}
84
+ borderRadius="15px"
85
+ padding={propPillObject.padding}
86
+ ></Pill>
87
+ </div>
88
+ {#if modal}
89
+ <div class="flex flex-col justify-center text-xs">
90
+ <Button
91
+ class="p-0 pl-1 m-0 h-[22px] bg-gray-700"
92
+ on:click={createModal}
93
+ >
94
+ <span class="text-xs">Edit</span>
95
+ <svg width="22" height="22">
96
+ <g transform="translate(2,2)scale(0.25)">
97
+ <path
98
+ stroke="none"
99
+ fill="white"
100
+ d="M38.406 22.234l11.36 11.36L28.784 54.576l-12.876 4.307c-1.725.577-3.367-1.065-2.791-2.79l4.307-12.876L38.406 22.234zM41.234 19.406l5.234-5.234c1.562-1.562 4.095-1.562 5.657 0l5.703 5.703c1.562 1.562 1.562 4.095 0 5.657l-5.234 5.234L41.234 19.406z"
101
+ ></path>
102
+ </g>
103
+ </svg>
104
+ </Button>
105
+ </div>
106
+ {/if}
107
+ </div>
108
+ {/snippet}
109
+
110
+ {#if source.inputType === "checkbox"}
111
+ <Checkbox bind:checked={value} color="orange">
112
+ {@render parameterName(source.name, propPillObject, true)}
113
+ </Checkbox>
114
+ {/if}
115
+
116
+ {#if source.inputType === "function" || source.inputType === "javascript"}
117
+ {@render parameterName(source.name, propPillObject, false, true)}
118
+ <!-- Container div for the Monaco editor:
119
+ - bind:this connects this element to our editorContainer variable state
120
+ - The height/border/rounded styles create the visual box for the editor
121
+ -->
122
+ <CodeBlock code={value} language="svelte" size="xs" includeHeader={false} />
123
+
124
+ <Modal
125
+ title={source.name}
126
+ bind:open={defaultModal}
127
+ size="lg"
128
+ classHeader="m-0 p-0 text-xl italic"
129
+ outsideclose
130
+ >
131
+ <div bind:this={editorContainer} class="h-[480px] w-full p-2"></div>
132
+ <svelte:fragment slot="footer"></svelte:fragment>
133
+ </Modal>
134
+ {:else if source.inputType === "dropdown"}
135
+ {@render parameterName(source.name, propPillObject)}
136
+ <Select
137
+ class="text-base"
138
+ items={source.options.map((el) => ({ name: el, value: el }))}
139
+ bind:value
140
+ />
141
+ {:else if source.inputType === "radio"}
142
+ {@render parameterName(source.name, propPillObject)}
143
+ {#each source.options as option, i}
144
+ <Radio value={option} bind:group={value}>
145
+ <span class="text-base font-normal">
146
+ {option}
147
+ </span>
148
+ </Radio>
149
+ {/each}
150
+ {:else if source.inputType === "textArea"}
151
+ <div>
152
+ {@render parameterName(source.name, propPillObject)}
153
+ <Textarea id="textarea-id" bind:value rows={9} />
154
+ </div>
155
+ {:else if source.inputType === "input"}
156
+ {@render parameterName(source.name, propPillObject)}
157
+ <Input size="lg" bind:value />
158
+ {:else if source.inputType === "numberInput"}
159
+ {@render parameterName(source.name, propPillObject)}
160
+ <Input let:props>
161
+ <input
162
+ type="number"
163
+ {...props}
164
+ step={source?.step}
165
+ min={source?.min}
166
+ max={source?.max}
167
+ bind:value
168
+ />
169
+ </Input>
170
+ {:else if source.inputType === "event"}
171
+ {@render parameterName(source.name, propPillObject)}
172
+ <p class="my-2 mx-0 p-0 text-sm text-black">
173
+ The {source.name} event handler has been called {value[0]} time{value[0] ===
174
+ 1
175
+ ? ""
176
+ : "s"}{value[1] ? " (" + value[1] + ")" : ""}.
177
+ </p>
178
+ {:else if "label" in source}
179
+ {@render parameterName(source.name, propPillObject)}
180
+ {/if}
181
+
182
+ {#if source.label}
183
+ <div
184
+ class="my-2 mx-0 p-2 text-sm text-slate-600 rounded-lg bg-white border border-solid border-slate-600"
185
+ >
186
+ <p class="underline underline-offset-4 p-0 m-0">Desc:</p>
187
+ <p class="p-0 m-0">
188
+ {source.label}
189
+ </p>
190
+ </div>
191
+ {/if}
192
+
193
+ {#if source.exampleCode}
194
+ <p
195
+ class="mt-4 mb-0 mx-0 p-0 break-words text-sm rounded-md"
196
+ style="color: #ba029b"
197
+ >
198
+ <CodeBlock
199
+ code={source.exampleCode}
200
+ language="svelte"
201
+ size="xs"
202
+ includeHeader={false}
203
+ />
204
+ </p>
205
+ {/if}
@@ -0,0 +1,13 @@
1
+ export default InputForParameter;
2
+ type InputForParameter = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ declare const InputForParameter: import("svelte").Component<{
7
+ source: any;
8
+ value?: any;
9
+ }, {}, "value">;
10
+ type $$ComponentProps = {
11
+ source: any;
12
+ value?: any;
13
+ };
@@ -0,0 +1,222 @@
1
+ <script>
2
+ import { Checkbox, Select, Radio, Textarea, Input } from "flowbite-svelte";
3
+ import CodeBlock from "./CodeBlock.svelte";
4
+ import loader from "@monaco-editor/loader";
5
+ import { onMount } from "svelte";
6
+
7
+ let {
8
+ demoScreenWidth,
9
+ statedValue = $bindable(),
10
+ derivedValue,
11
+ parameter,
12
+ } = $props();
13
+
14
+ let useStatedValue = $derived(derivedValue == null);
15
+ let useRadio = $derived(
16
+ parameter.isEditable && parameter.propType === "radio",
17
+ );
18
+ let useDropdown = $derived(
19
+ (parameter.isEditable && parameter.inputType === "dropdown") ||
20
+ "options" in parameter,
21
+ );
22
+ let useTextarea = $derived(
23
+ parameter.isEditable &&
24
+ typeof (useStatedValue ? statedValue : derivedValue) === "string" &&
25
+ typeof parameter.value === "string",
26
+ );
27
+ let useNumberInput = $derived(
28
+ (parameter.isEditable && typeof statedValue === "number") ||
29
+ (statedValue === null && typeof parameter.value === "number"),
30
+ );
31
+ let useCheckbox = $derived(
32
+ parameter.isEditable && typeof statedValue === "boolean",
33
+ );
34
+ let useMonacoEditor = $derived(
35
+ parameter.isEditable &&
36
+ useStatedValue &&
37
+ !useRadio &&
38
+ !useDropdown &&
39
+ !useTextarea &&
40
+ !useNumberInput &&
41
+ !useCheckbox,
42
+ );
43
+
44
+ let monacoEditorContainerWidth = $derived(
45
+ useMonacoEditor
46
+ ? demoScreenWidth < 1024
47
+ ? 350
48
+ : demoScreenWidth < 1280
49
+ ? 450
50
+ : 550
51
+ : null,
52
+ );
53
+
54
+ let monacoEditorContainerHeight = $derived(
55
+ useMonacoEditor && monacoEditorContainerWidth
56
+ ? 40 +
57
+ 20 *
58
+ JSON.stringify(parameter.value, null, 2)
59
+ .split("\n")
60
+ .reduce(
61
+ (acc, str) =>
62
+ acc +
63
+ Math.ceil(
64
+ str.length / ((monacoEditorContainerWidth - 15) / 7.5),
65
+ ),
66
+ 0,
67
+ )
68
+ : null,
69
+ );
70
+
71
+ let editorContainer = $state();
72
+ let monacoEditor;
73
+
74
+ onMount(async () => {
75
+ if (useMonacoEditor) {
76
+ // Load the Monaco editor library
77
+ const monaco = await loader.init();
78
+
79
+ monacoEditor = monaco.editor.create(editorContainer, {
80
+ value: statedValue, // Initial editor content bound to the component's value prop
81
+ language: "javascript",
82
+ theme: "vs-light",
83
+ minimap: { enabled: false },
84
+ scrollbar: {
85
+ verticalScrollbarSize: 8,
86
+ },
87
+ lineNumbers: "off",
88
+ folding: false,
89
+ scrollBeyondLastLine: false,
90
+ automaticLayout: true,
91
+ fontSize: 13,
92
+ formatOnPaste: true,
93
+ formatOnType: true,
94
+ wordWrap: "on",
95
+ overviewRulerLanes: 0, // Disables the overview ruler
96
+ overviewRulerBorder: false,
97
+ });
98
+
99
+ // Establish two-way data binding between editor content and component's value prop
100
+ monacoEditor.onDidChangeModelContent(() => {
101
+ statedValue = monacoEditor.getValue();
102
+ });
103
+
104
+ // Cleanup: Dispose Monaco editor instance on component destruction
105
+ return () => {
106
+ monacoEditor?.dispose();
107
+ };
108
+ }
109
+ });
110
+
111
+ // $inspect(derivedValue, parameter.name);
112
+ </script>
113
+
114
+ {#if useStatedValue}
115
+ {#if useRadio}
116
+ <div class="flex flex-col gap-2">
117
+ {#each parameter.options as option, i}
118
+ <Radio value={option} bind:group={statedValue}>
119
+ <span class="text-sm">
120
+ {option}
121
+ </span>
122
+ </Radio>
123
+ {/each}
124
+ </div>
125
+ {:else if useDropdown}
126
+ <Select
127
+ size="sm"
128
+ class="text-base m-0 py-1 pr-8"
129
+ items={parameter.options.map((el) => ({ name: el, value: el }))}
130
+ bind:value={statedValue}
131
+ />
132
+ {:else if useTextarea}
133
+ <Textarea
134
+ unWrappedClass="m-0 px-2 py-1 focus:ring-orange-500 focus:border-orange-500"
135
+ id="textarea-id"
136
+ bind:value={statedValue}
137
+ rows={parameter.rows ?? 1}
138
+ />
139
+ {:else if useNumberInput}
140
+ <Input let:props>
141
+ <input
142
+ type="number"
143
+ {...props}
144
+ step={parameter.step}
145
+ min={parameter.min}
146
+ max={parameter.max}
147
+ bind:value={statedValue}
148
+ />
149
+ </Input>
150
+ {:else if useCheckbox}
151
+ <div class="p-2 h-full">
152
+ <Checkbox bind:checked={statedValue} color="orange"></Checkbox>
153
+ </div>
154
+ {:else if useMonacoEditor}
155
+ <div
156
+ bind:this={editorContainer}
157
+ class="py-2 px-1 m-0 border-solid border-[2px] rounded-md focus-within:ring-orange-500 focus-within:border-orange-500"
158
+ style="height: {monacoEditorContainerHeight}px; width: {monacoEditorContainerWidth}px;"
159
+ ></div>
160
+ {/if}
161
+ {:else}
162
+ <div class="flex flex-col gap-4">
163
+ {#if parameter.hasOwnProperty("functionElements") && parameter.functionElements != null && (parameter.functionElements.hasOwnProperty("counter") || (parameter.functionElements.hasOwnProperty("dataset") && parameter.functionElements.hasOwnProperty("dataset") != null))}
164
+ <div
165
+ data-role="function-counter-and-data-container"
166
+ class="py-1 px-3 bg-slate-100 rounded"
167
+ >
168
+ {#if parameter.functionElements.hasOwnProperty("counter")}
169
+ <p>
170
+ This function has been called <span class="font-bold"
171
+ >{parameter.functionElements.counter}
172
+ time{parameter.functionElements.counter === 1 ? "" : "s"}.</span
173
+ >
174
+ </p>
175
+ {#if parameter.functionElements.hasOwnProperty("dataset")}
176
+ {#each Object.keys(parameter.functionElements.dataset) as key}
177
+ {#if parameter.functionElements.dataset[key] != null}
178
+ <p>
179
+ When it was last called, its target's data-{key} was
180
+ <span class="font-bold"
181
+ >{parameter.functionElements.dataset[key]}</span
182
+ >.
183
+ </p>
184
+ {/if}
185
+ {/each}
186
+ {/if}
187
+ {/if}
188
+ </div>
189
+ {/if}
190
+ {#if (parameter.hasOwnProperty("functionElements") && parameter.functionElements != null && parameter.functionElements.hasOwnProperty("functionAsString") && parameter.functionElements.functionAsString != null) || (parameter?.propType === "fixed" && !parameter.hasOwnProperty("functionElements")) || (!parameter?.isEditable && !parameter.hasOwnProperty("functionElements"))}
191
+ <div class="overflow-scroll" style="max-height: 768px;">
192
+ {#key derivedValue}
193
+ <CodeBlock
194
+ code={typeof derivedValue === "function"
195
+ ? parameter.functionElements?.functionAsString.replace(
196
+ /getValue\("([^"]+)"\)/g,
197
+ "$1",
198
+ )
199
+ : typeof derivedValue === "object"
200
+ ? derivedValue
201
+ : derivedValue.toString()}
202
+ language="javascript"
203
+ size="sm"
204
+ includeHeader={false}
205
+ ></CodeBlock>
206
+ {/key}
207
+ </div>
208
+ {/if}
209
+ </div>
210
+ {/if}
211
+
212
+ <style>
213
+ [data-role="function-counter-and-data-container"] p:first-of-type {
214
+ padding-top: 0px;
215
+ margin-top: 0px;
216
+ }
217
+
218
+ [data-role="function-counter-and-data-container"] p:last-of-type {
219
+ padding-bottom: 0px;
220
+ margin-bottom: 0px;
221
+ }
222
+ </style>
@@ -0,0 +1,17 @@
1
+ export default InputForParameterUpdated;
2
+ type InputForParameterUpdated = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ declare const InputForParameterUpdated: import("svelte").Component<{
7
+ demoScreenWidth: any;
8
+ statedValue?: any;
9
+ derivedValue: any;
10
+ parameter: any;
11
+ }, {}, "statedValue">;
12
+ type $$ComponentProps = {
13
+ demoScreenWidth: any;
14
+ statedValue?: any;
15
+ derivedValue: any;
16
+ parameter: any;
17
+ };
@@ -0,0 +1,203 @@
1
+ <script>
2
+ import { Checkbox, Select, Radio, Textarea, Input } from "flowbite-svelte";
3
+ import CodeBlock from "./CodeBlock.svelte";
4
+ import loader from "@monaco-editor/loader";
5
+ import { onMount } from "svelte";
6
+
7
+ let {
8
+ parameter,
9
+ value = $bindable(),
10
+ boundedValue,
11
+ demoScreenWidth,
12
+ } = $props();
13
+
14
+ let editorContainer = $state();
15
+
16
+ let monacoEditor;
17
+
18
+ let showMonacoEditor = $derived(
19
+ typeof parameter.value === "object" && parameter.isEditable,
20
+ );
21
+
22
+ let monacoEditorContainerWidth = $derived(
23
+ showMonacoEditor
24
+ ? demoScreenWidth < 1024
25
+ ? 350
26
+ : demoScreenWidth < 1280
27
+ ? 450
28
+ : 550
29
+ : null,
30
+ );
31
+
32
+ let monacoEditorContainerHeight = $derived(
33
+ showMonacoEditor && monacoEditorContainerWidth
34
+ ? 40 +
35
+ 20 *
36
+ JSON.stringify(parameter.value, null, 2)
37
+ .split("\n")
38
+ .reduce(
39
+ (acc, str) =>
40
+ acc +
41
+ Math.ceil(
42
+ str.length / ((monacoEditorContainerWidth - 15) / 7.5),
43
+ ),
44
+ 0,
45
+ )
46
+ : null,
47
+ );
48
+
49
+ onMount(async () => {
50
+ if (showMonacoEditor) {
51
+ // Load the Monaco editor library
52
+ const monaco = await loader.init();
53
+
54
+ monacoEditor = monaco.editor.create(editorContainer, {
55
+ value: value, // Initial editor content bound to the component's value prop
56
+ language: "javascript",
57
+ theme: "vs-light",
58
+ minimap: { enabled: false },
59
+ scrollbar: {
60
+ verticalScrollbarSize: 8,
61
+ },
62
+ lineNumbers: "off",
63
+ folding: false,
64
+ scrollBeyondLastLine: false,
65
+ automaticLayout: true,
66
+ fontSize: 13,
67
+ formatOnPaste: true,
68
+ formatOnType: true,
69
+ wordWrap: "on",
70
+ overviewRulerLanes: 0, // Disables the overview ruler
71
+ overviewRulerBorder: false,
72
+ });
73
+
74
+ // Establish two-way data binding between editor content and component's value prop
75
+ monacoEditor.onDidChangeModelContent(() => {
76
+ value = monacoEditor.getValue();
77
+ });
78
+
79
+ // Cleanup: Dispose Monaco editor instance on component destruction
80
+ return () => {
81
+ monacoEditor?.dispose();
82
+ };
83
+ }
84
+ });
85
+
86
+ $inspect(parameter.name, value, boundedValue);
87
+ </script>
88
+
89
+ {#if parameter.isEditable}
90
+ {#if showMonacoEditor}
91
+ <div
92
+ bind:this={editorContainer}
93
+ class="py-2 px-1 m-0 border-solid border-[2px] rounded-md focus-within:ring-orange-500 focus-within:border-orange-500"
94
+ style="height: {monacoEditorContainerHeight}px; width: {monacoEditorContainerWidth}px;"
95
+ ></div>
96
+ {:else if parameter.inputType === "checkbox"}
97
+ <div class="p-2 h-full">
98
+ <Checkbox bind:checked={value} color="orange"></Checkbox>
99
+ </div>
100
+ {:else if parameter.inputType === "dropdown"}
101
+ <Select
102
+ size="sm"
103
+ class="text-base m-0 px-2 py-1"
104
+ items={parameter.options.map((el) => ({ name: el, value: el }))}
105
+ bind:value
106
+ />
107
+ {:else if parameter.inputType === "radio"}
108
+ <div class="flex flex-col gap-2">
109
+ {#each parameter.options as option, i}
110
+ <Radio value={option} bind:group={value}>
111
+ <span class="text-sm">
112
+ {option}
113
+ </span>
114
+ </Radio>
115
+ {/each}
116
+ </div>
117
+ {:else if parameter.inputType === "input"}
118
+ <Textarea
119
+ unWrappedClass="m-0 px-2 py-1 focus:ring-orange-500 focus:border-orange-500"
120
+ id="textarea-id"
121
+ bind:value
122
+ rows={parameter.rows ?? 1}
123
+ />
124
+ {:else if parameter.inputType === "numberInput"}
125
+ <Input let:props>
126
+ <input
127
+ type="number"
128
+ {...props}
129
+ step={parameter?.step}
130
+ min={parameter?.min}
131
+ max={parameter?.max}
132
+ bind:value
133
+ />
134
+ </Input>
135
+ {/if}
136
+ {:else}
137
+ {#key boundedValue}
138
+ <CodeBlock
139
+ code={boundedValue}
140
+ language="javascript"
141
+ size="sm"
142
+ includeHeader={false}
143
+ ></CodeBlock>
144
+ {/key}
145
+ {/if}
146
+
147
+ <!-- {#if showMonacoEditor}
148
+ <div
149
+ bind:this={editorContainer}
150
+ class="py-2 px-1 m-0 border-solid border-[2px] rounded-md focus-within:ring-orange-500 focus-within:border-orange-500"
151
+ style="height: {monacoEditorContainerHeight}px; width: {monacoEditorContainerWidth}px;"
152
+ ></div>
153
+ {:else if parameter.inputType === "code"}
154
+ <div bind:clientHeight={codeBlockHeight} bind:clientWidth={codeBlockWidth}>
155
+ <CodeBlock
156
+ code={codeBlockType === "function"
157
+ ? "function " + codeBlockValue.toString().slice(5)
158
+ : codeBlockValue}
159
+ language="javascript"
160
+ size="sm"
161
+ includeHeader={false}
162
+ ></CodeBlock>
163
+ </div>
164
+ {:else if parameter.inputType === "checkbox"}
165
+ <div class="p-2 h-full">
166
+ <Checkbox bind:checked={value} color="orange"></Checkbox>
167
+ </div>
168
+ {:else if parameter.inputType === "dropdown"}
169
+ <Select
170
+ size="sm"
171
+ class="text-base m-0 px-2 py-1"
172
+ items={parameter.options.map((el) => ({ name: el, value: el }))}
173
+ bind:value
174
+ />
175
+ {:else if parameter.inputType === "radio"}
176
+ <div class="flex flex-col gap-2">
177
+ {#each parameter.options as option, i}
178
+ <Radio value={option} bind:group={value}>
179
+ <span class="text-sm">
180
+ {option}
181
+ </span>
182
+ </Radio>
183
+ {/each}
184
+ </div>
185
+ {:else if parameter.inputType === "input"}
186
+ <Textarea
187
+ unWrappedClass="m-0 px-2 py-1 focus:ring-orange-500 focus:border-orange-500"
188
+ id="textarea-id"
189
+ bind:value
190
+ rows={parameter.rows ?? 1}
191
+ />
192
+ {:else if parameter.inputType === "numberInput"}
193
+ <Input let:props>
194
+ <input
195
+ type="number"
196
+ {...props}
197
+ step={parameter?.step}
198
+ min={parameter?.min}
199
+ max={parameter?.max}
200
+ bind:value
201
+ />
202
+ </Input>
203
+ {/if} -->
@@ -0,0 +1,17 @@
1
+ export default InputForParameterUpdatedTemp;
2
+ type InputForParameterUpdatedTemp = {
3
+ $on?(type: string, callback: (e: any) => void): () => void;
4
+ $set?(props: Partial<$$ComponentProps>): void;
5
+ };
6
+ declare const InputForParameterUpdatedTemp: import("svelte").Component<{
7
+ parameter: any;
8
+ value?: any;
9
+ boundedValue: any;
10
+ demoScreenWidth: any;
11
+ }, {}, "value">;
12
+ type $$ComponentProps = {
13
+ parameter: any;
14
+ value?: any;
15
+ boundedValue: any;
16
+ demoScreenWidth: any;
17
+ };
@@ -0,0 +1,19 @@
1
+ <script>
2
+ import Pill from "./Pill.svelte";
3
+
4
+ let { statusObject } = $props();
5
+ </script>
6
+
7
+ <div data-role="status-container" class="flex flex-row flex-wrap gap-2">
8
+ {#each Object.keys(statusObject) as category, index}
9
+ {@const labels = Object.keys(statusObject[category]).filter(
10
+ (el) => statusObject[category][el],
11
+ )}
12
+ <div data-role="category-container" class="flex flex-row gap-2">
13
+ {#each labels as label}
14
+ <Pill textContent={label} bgColor="black" textColor="white" size="small"
15
+ ></Pill>
16
+ {/each}
17
+ </div>
18
+ {/each}
19
+ </div>