pimelon-ui 0.1.238 → 0.1.262

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 (298) hide show
  1. package/icons/Icon.vue +28 -0
  2. package/icons/IconPicker.story.vue +126 -0
  3. package/icons/IconPicker.vue +221 -0
  4. package/icons/index.ts +5 -0
  5. package/icons/spritePlugin.ts +13 -0
  6. package/melon/DataImport/MappingStep.vue +2 -2
  7. package/melon/DataImport/PreviewStep.vue +18 -2
  8. package/melon/DataImport/UploadStep.vue +2 -2
  9. package/melon/Filter/Filter.vue +1 -0
  10. package/melon/Filter/utils.ts +5 -4
  11. package/melon/drive/components/AppSwitcher.vue +47 -0
  12. package/melon/drive/components/DriveLogo.vue +18 -0
  13. package/melon/drive/components/InfoDialog.vue +207 -0
  14. package/melon/drive/components/MoveDialog.vue +450 -0
  15. package/melon/drive/components/RenameDialog.vue +76 -0
  16. package/melon/drive/components/Select/Select.vue +136 -0
  17. package/melon/drive/components/Select/types.ts +18 -0
  18. package/melon/drive/components/ShareDialog.vue +397 -0
  19. package/melon/drive/components/TagInput/TagInput.vue +113 -0
  20. package/melon/drive/components/TagInput/types.ts +45 -0
  21. package/melon/drive/components/TagInput/utils.ts +63 -0
  22. package/melon/drive/components/TeamSelector.vue +50 -0
  23. package/melon/drive/index.js +6 -0
  24. package/melon/drive/js/icons.js +705 -0
  25. package/melon/drive/js/resources.js +110 -0
  26. package/melon/drive/js/utils.js +110 -0
  27. package/melon/index.js +3 -1
  28. package/melon/telemetry/index.ts +48 -0
  29. package/melon/telemetry/pulse.ts +181 -0
  30. package/melon/telemetry/telemetry.test.ts +87 -0
  31. package/melon/telemetry/utils.ts +15 -0
  32. package/package.json +49 -33
  33. package/src/components/Alert/Alert.vue +20 -1
  34. package/src/components/Alert/stories/Controlled.vue +16 -0
  35. package/src/components/Alert/stories/Slots.vue +20 -0
  36. package/src/components/Alert/stories/Themes.vue +14 -0
  37. package/src/components/Alert/types.ts +26 -1
  38. package/src/components/Avatar/Avatar.vue +9 -0
  39. package/src/components/Avatar/stories/Shapes.vue +12 -0
  40. package/src/components/Avatar/stories/Sizes.vue +10 -0
  41. package/src/components/Avatar/types.ts +7 -0
  42. package/src/components/Badge/Badge.vue +14 -2
  43. package/src/components/Badge/stories/Themes.vue +10 -0
  44. package/src/components/Badge/stories/Variants.vue +10 -0
  45. package/src/components/Badge/types.ts +8 -0
  46. package/src/components/Breadcrumbs/Breadcrumbs.vue +26 -0
  47. package/src/components/Breadcrumbs/stories/Example.vue +13 -0
  48. package/src/components/Breadcrumbs/stories/Slots.vue +24 -0
  49. package/src/components/Breadcrumbs/types.ts +9 -1
  50. package/src/components/Button/Button.vue +14 -0
  51. package/src/components/Button/stories/Icons.vue +27 -0
  52. package/src/components/Button/stories/Sizes.vue +11 -0
  53. package/src/components/Button/stories/Themes.vue +10 -0
  54. package/src/components/Button/stories/Variants.vue +10 -0
  55. package/src/components/Button/types.ts +29 -1
  56. package/src/components/Calendar/Calendar.vue +0 -1
  57. package/src/components/Calendar/stories/CustomHeader.vue +151 -0
  58. package/src/components/Calendar/stories/Examples.vue +102 -0
  59. package/src/components/Charts/ECharts.vue +9 -6
  60. package/src/components/Charts/NumberChart.vue +7 -3
  61. package/src/components/Charts/{Charts.story.vue → stories/Examples.vue} +37 -29
  62. package/src/components/Checkbox/stories/Examples.vue +8 -0
  63. package/src/components/Checkbox/types.ts +11 -0
  64. package/src/components/CircularProgressBar/CircularProgressBar.story.vue +62 -59
  65. package/src/components/CircularProgressBar/types.ts +17 -3
  66. package/src/components/Combobox/Combobox.vue +29 -9
  67. package/src/components/Combobox/stories/CustomRender.vue +26 -0
  68. package/src/components/Combobox/stories/Grouped.vue +40 -0
  69. package/src/components/Combobox/stories/OptionSlots.vue +42 -0
  70. package/src/components/Combobox/stories/Simple.vue +19 -0
  71. package/src/components/Combobox/stories/WithIcons.vue +16 -0
  72. package/src/components/Combobox/types.ts +15 -0
  73. package/src/components/ConfirmDialog.vue +5 -1
  74. package/src/components/DatePicker/DatePicker.vue +1 -1
  75. package/src/components/DatePicker/DateRangePicker.vue +1 -1
  76. package/src/components/DatePicker/DateTimePicker.vue +3 -3
  77. package/src/components/DatePicker/stories/DateTime.vue +16 -0
  78. package/src/components/DatePicker/stories/Examples.vue +11 -0
  79. package/src/components/DatePicker/stories/Range.vue +12 -0
  80. package/src/components/DatePicker/types.ts +1 -1
  81. package/src/components/DatePicker/utils.ts +1 -1
  82. package/src/components/Dialog/Dialog.vue +22 -0
  83. package/src/components/Dialog/stories/Confirm.vue +38 -0
  84. package/src/components/Dialog/stories/Custom.vue +38 -0
  85. package/src/components/Dialog/stories/Interactive.vue +48 -0
  86. package/src/components/Dialog/stories/Modal.vue +21 -0
  87. package/src/components/Dialog/types.ts +5 -0
  88. package/src/components/Dropdown/Dropdown.vue +8 -0
  89. package/src/components/Dropdown/stories/CustomTrigger.vue +19 -0
  90. package/src/components/Dropdown/stories/Examples.vue +17 -0
  91. package/src/components/Dropdown/stories/Grouped.vue +36 -0
  92. package/src/components/Dropdown/stories/Submenus.vue +31 -0
  93. package/src/components/Dropdown/stories/Switches.vue +28 -0
  94. package/src/components/Dropdown/types.ts +13 -1
  95. package/src/components/ErrorMessage/stories/ErrorObject.vue +15 -0
  96. package/src/components/ErrorMessage/stories/Examples.vue +10 -0
  97. package/src/components/ErrorMessage/types.ts +1 -0
  98. package/src/components/FileUploader/stories/Examples.vue +25 -0
  99. package/src/components/FormControl/FormControl.story.vue +85 -101
  100. package/src/components/FormControl/FormControl.vue +13 -0
  101. package/src/components/FormControl/types.ts +6 -0
  102. package/src/components/ListView/stories/CellSlot.vue +65 -0
  103. package/src/components/ListView/stories/CustomList.vue +120 -0
  104. package/src/components/ListView/stories/Empty.vue +40 -0
  105. package/src/components/ListView/stories/Examples.vue +56 -0
  106. package/src/components/ListView/stories/GroupedRows.vue +152 -0
  107. package/src/components/MonthPicker/MonthPicker.vue +7 -1
  108. package/src/components/MonthPicker/stories/Example.vue +10 -0
  109. package/src/components/MonthPicker/types.ts +4 -0
  110. package/src/components/MultiSelect/MultiSelect.vue +9 -1
  111. package/src/components/MultiSelect/stories/Example.vue +24 -0
  112. package/src/components/MultiSelect/stories/Footer.vue +43 -0
  113. package/src/components/MultiSelect/stories/Options.vue +33 -0
  114. package/src/components/MultiSelect/types.ts +5 -0
  115. package/src/components/Password/Password.vue +19 -14
  116. package/src/components/Password/stories/Example.vue +10 -0
  117. package/src/components/Password/types.ts +3 -0
  118. package/src/components/Popover/Popover.vue +42 -8
  119. package/src/components/Popover/stories/Click.vue +14 -0
  120. package/src/components/Popover/stories/Hover.vue +14 -0
  121. package/src/components/Popover/types.ts +20 -6
  122. package/src/components/Progress/Progress.vue +7 -0
  123. package/src/components/Progress/stories/Examples.vue +7 -0
  124. package/src/components/Progress/stories/Hint.vue +7 -0
  125. package/src/components/Progress/stories/Intervals.vue +12 -0
  126. package/src/components/Progress/stories/Sizes.vue +10 -0
  127. package/src/components/Progress/types.ts +11 -0
  128. package/src/components/Rating/stories/Examples.vue +7 -0
  129. package/src/components/Rating/types.ts +10 -1
  130. package/src/components/Select/Select.vue +42 -33
  131. package/src/components/Select/stories/Example.vue +42 -0
  132. package/src/components/Select/stories/OptionSlot.vue +62 -0
  133. package/src/components/Select/stories/TriggerSlots.vue +51 -0
  134. package/src/components/Select/types.ts +14 -1
  135. package/src/components/Sidebar/Sidebar.vue +19 -15
  136. package/src/components/Sidebar/stories/Example.vue +88 -0
  137. package/src/components/Slider/Slider.vue +38 -0
  138. package/src/components/Slider/index.ts +1 -0
  139. package/src/components/Slider/stories/Example.vue +11 -0
  140. package/src/components/Slider/stories/Range.vue +11 -0
  141. package/src/components/Slider/types.ts +5 -0
  142. package/src/components/Switch/Switch.vue +5 -1
  143. package/src/components/Switch/stories/Example.vue +7 -0
  144. package/src/components/Switch/stories/Labels.vue +17 -0
  145. package/src/components/Switch/types.ts +12 -1
  146. package/src/components/TabButtons/TabButtons.story.vue +17 -17
  147. package/src/components/Tabs/Tabs.vue +10 -0
  148. package/src/components/Tabs/stories/Icons.vue +40 -0
  149. package/src/components/Tabs/stories/Orientation.vue +44 -0
  150. package/src/components/Tabs/types.ts +13 -3
  151. package/src/components/TextEditor/TextEditor.vue +42 -170
  152. package/src/components/TextEditor/commands.js +55 -39
  153. package/src/components/TextEditor/{FontColor.vue → components/FontColor.vue} +2 -2
  154. package/src/components/TextEditor/{ImageViewerModal.vue → components/ImageViewerModal.vue} +4 -4
  155. package/src/components/TextEditor/{InsertImage.vue → components/InsertImage.vue} +1 -1
  156. package/src/components/TextEditor/{LinkPopup.vue → components/LinkPopup.vue} +4 -4
  157. package/src/components/TextEditor/components/MediaNodeView.vue +377 -0
  158. package/src/components/TextEditor/components/Menu.vue +206 -0
  159. package/src/components/TextEditor/{TextEditorBubbleMenu.vue → components/TextEditorBubbleMenu.vue} +5 -13
  160. package/src/components/TextEditor/{TextEditorFixedMenu.vue → components/TextEditorFixedMenu.vue} +10 -6
  161. package/src/components/TextEditor/{TextEditorFloatingMenu.vue → components/TextEditorFloatingMenu.vue} +4 -3
  162. package/src/components/TextEditor/components/index.js +0 -0
  163. package/src/components/TextEditor/extensions/code-block.ts +2 -2
  164. package/src/components/TextEditor/extensions/content-paste-extension.ts +45 -37
  165. package/src/components/TextEditor/extensions/copy-styles.ts +159 -0
  166. package/src/components/TextEditor/extensions/highlight/highlight-styles.css +0 -1
  167. package/src/components/TextEditor/extensions/iframe/InsertIframe.vue +13 -3
  168. package/src/components/TextEditor/extensions/image/image-extension.ts +26 -5
  169. package/src/components/TextEditor/extensions/image-group/ImageGroupNodeView.vue +18 -53
  170. package/src/components/TextEditor/extensions/image-group/image-group-extension.ts +71 -0
  171. package/src/components/TextEditor/{image-viewer-extension.ts → extensions/image-viewer-extension.ts} +1 -1
  172. package/src/components/TextEditor/extensions/link/index.ts +1 -0
  173. package/src/components/TextEditor/{link-extension.ts → extensions/link/link-extension.ts} +5 -15
  174. package/src/components/TextEditor/{linkPasteHandler.ts → extensions/link/linkPasteHandler.ts} +1 -1
  175. package/src/components/TextEditor/extensions/mention/mention-extension.ts +22 -1
  176. package/src/components/TextEditor/extensions/slash-commands/slash-commands-extension.ts +13 -0
  177. package/src/components/TextEditor/extensions/tag/index.ts +1 -0
  178. package/src/components/TextEditor/extensions/tag/tag-extension.ts +14 -0
  179. package/src/components/TextEditor/extensions/toc-node/TocNodeView.vue +438 -0
  180. package/src/components/TextEditor/extensions/toc-node/index.ts +3 -0
  181. package/src/components/TextEditor/extensions/toc-node/toc-node-extension.ts +166 -0
  182. package/src/components/TextEditor/extensions/video-extension.ts +603 -0
  183. package/src/components/TextEditor/index.ts +3 -3
  184. package/src/components/TextEditor/stories/Comment.vue +53 -0
  185. package/src/components/TextEditor/stories/Example.vue +33 -0
  186. package/src/components/TextEditor/style.css +164 -0
  187. package/src/components/TextEditor/types.ts +37 -1
  188. package/src/components/TextInput/TextInput.vue +9 -1
  189. package/src/components/TextInput/stories/List.vue +71 -0
  190. package/src/components/TextInput/types.ts +17 -0
  191. package/src/components/Textarea/stories/Variants.vue +8 -0
  192. package/src/components/Textarea/types.ts +17 -0
  193. package/src/components/TimePicker/TimePicker.vue +18 -0
  194. package/src/components/TimePicker/stories/Basic.vue +15 -0
  195. package/src/components/TimePicker/stories/CustomOptions.vue +26 -0
  196. package/src/components/TimePicker/stories/Range.vue +15 -0
  197. package/src/components/TimePicker/stories/TwentyFour.vue +11 -0
  198. package/src/components/TimePicker/types.ts +38 -0
  199. package/src/components/Tooltip/Tooltip.vue +21 -0
  200. package/src/components/Tooltip/stories/Examples.vue +9 -0
  201. package/src/components/Tooltip/stories/Slots.vue +16 -0
  202. package/src/components/Tooltip/types.ts +21 -0
  203. package/src/components/Tree/Tree.vue +5 -0
  204. package/src/components/Tree/{Tree.story.vue → stories/Example.vue} +15 -25
  205. package/src/components/Tree/types.ts +34 -6
  206. package/src/data-fetching/docStore.ts +17 -5
  207. package/src/data-fetching/useDoc/useDoc.ts +19 -15
  208. package/src/data-fetching/useList/useList.ts +8 -2
  209. package/src/directives/focus.ts +46 -0
  210. package/src/env.d.ts +0 -1
  211. package/src/index.ts +5 -4
  212. package/src/resources/documentResource.js +1 -0
  213. package/src/utils/tailwind.config.js +1 -1
  214. package/tailwind/index.js +1 -0
  215. package/vite/melonProxy.js +1 -1
  216. package/src/components/Alert/Alert.story.vue +0 -78
  217. package/src/components/Autocomplete/Autocomplete.story.vue +0 -104
  218. package/src/components/Avatar/Avatar.story.vue +0 -28
  219. package/src/components/Badge/Badge.story.vue +0 -26
  220. package/src/components/Breadcrumbs/Breadcrumbs.story.vue +0 -73
  221. package/src/components/Button/Button.story.vue +0 -34
  222. package/src/components/Calendar/Calendar.story.md +0 -197
  223. package/src/components/Calendar/Calendar.story.vue +0 -191
  224. package/src/components/Checkbox/Checkbox.story.vue +0 -22
  225. package/src/components/CircularProgressBar/CircularProgressBar.story.md +0 -43
  226. package/src/components/Combobox/Combobox.story.vue +0 -348
  227. package/src/components/DatePicker/DatePicker.story.vue +0 -36
  228. package/src/components/Dialog/Dialog.story.vue +0 -229
  229. package/src/components/Dropdown/Dropdown.story.vue +0 -225
  230. package/src/components/ErrorMessage/ErrorMessage.story.vue +0 -28
  231. package/src/components/FileUploader/FileUploader.story.vue +0 -34
  232. package/src/components/ListView/ListView.story.md +0 -137
  233. package/src/components/ListView/ListView.story.vue +0 -437
  234. package/src/components/MonthPicker/MonthPicker.story.vue +0 -21
  235. package/src/components/MultiSelect/MultiSelect.story.vue +0 -68
  236. package/src/components/Password/Password.story.vue +0 -14
  237. package/src/components/Popover/Popover.story.vue +0 -29
  238. package/src/components/Progress/Progress.story.vue +0 -34
  239. package/src/components/Rating/Rating.story.vue +0 -18
  240. package/src/components/Select/Select.story.vue +0 -78
  241. package/src/components/Sidebar/Sidebar.story.vue +0 -80
  242. package/src/components/Spinner/Spinner.story.vue +0 -14
  243. package/src/components/Spinner/Spinner.vue +0 -50
  244. package/src/components/Spinner/index.ts +0 -1
  245. package/src/components/Switch/Switch.story.vue +0 -59
  246. package/src/components/Tabs/Tabs.story.vue +0 -100
  247. package/src/components/TextEditor/Menu.vue +0 -110
  248. package/src/components/TextEditor/TextEditor.story.vue +0 -89
  249. package/src/components/TextEditor/extensions/image/ImageNodeView.vue +0 -263
  250. package/src/components/TextEditor/extensions/list-extension.ts +0 -32
  251. package/src/components/TextEditor/icons/align-center.vue +0 -14
  252. package/src/components/TextEditor/icons/align-justify.vue +0 -14
  253. package/src/components/TextEditor/icons/align-left.vue +0 -14
  254. package/src/components/TextEditor/icons/align-right.vue +0 -14
  255. package/src/components/TextEditor/icons/arrow-go-back-line.vue +0 -14
  256. package/src/components/TextEditor/icons/arrow-go-forward-line.vue +0 -14
  257. package/src/components/TextEditor/icons/bold.vue +0 -14
  258. package/src/components/TextEditor/icons/code-view.vue +0 -14
  259. package/src/components/TextEditor/icons/double-quotes-r.vue +0 -14
  260. package/src/components/TextEditor/icons/font-color.vue +0 -14
  261. package/src/components/TextEditor/icons/format-clear.vue +0 -14
  262. package/src/components/TextEditor/icons/h-1.vue +0 -14
  263. package/src/components/TextEditor/icons/h-2.vue +0 -14
  264. package/src/components/TextEditor/icons/h-3.vue +0 -14
  265. package/src/components/TextEditor/icons/h-4.vue +0 -14
  266. package/src/components/TextEditor/icons/h-5.vue +0 -14
  267. package/src/components/TextEditor/icons/h-6.vue +0 -14
  268. package/src/components/TextEditor/icons/image-add-line.vue +0 -14
  269. package/src/components/TextEditor/icons/italic.vue +0 -14
  270. package/src/components/TextEditor/icons/link.vue +0 -14
  271. package/src/components/TextEditor/icons/list-ordered.vue +0 -14
  272. package/src/components/TextEditor/icons/list-task.vue +0 -20
  273. package/src/components/TextEditor/icons/list-unordered.vue +0 -14
  274. package/src/components/TextEditor/icons/readme.md +0 -1
  275. package/src/components/TextEditor/icons/separator.vue +0 -14
  276. package/src/components/TextEditor/icons/strikethrough.vue +0 -14
  277. package/src/components/TextEditor/icons/table-2.vue +0 -14
  278. package/src/components/TextEditor/icons/text.vue +0 -11
  279. package/src/components/TextEditor/icons/underline.vue +0 -14
  280. package/src/components/TextEditor/icons/video-add-line.vue +0 -14
  281. package/src/components/TextEditor/mention.js +0 -72
  282. package/src/components/TextEditor/video-extension.ts +0 -162
  283. package/src/components/TextInput/TextInput.story.vue +0 -81
  284. package/src/components/Textarea/Textarea.story.vue +0 -27
  285. package/src/components/TimePicker/TimePicker.story.vue +0 -138
  286. package/src/components/Tooltip/Tooltip.story.vue +0 -51
  287. package/src/components/Tree/Tree.story.md +0 -56
  288. /package/src/components/TextEditor/{CodeBlockComponent.vue → components/CodeBlockComponent.vue} +0 -0
  289. /package/src/components/TextEditor/{InsertLink.vue → components/InsertLink.vue} +0 -0
  290. /package/src/components/TextEditor/{InsertVideo.vue → components/InsertVideo.vue} +0 -0
  291. /package/src/components/TextEditor/{MentionList.vue → components/MentionList.vue} +0 -0
  292. /package/{src/tailwind → tailwind}/colorPalette.js +0 -0
  293. /package/{src/tailwind → tailwind}/colors.js +0 -0
  294. /package/{src/tailwind → tailwind}/colors.json +0 -0
  295. /package/{src/tailwind → tailwind}/figma-variables-to-colors.js +0 -0
  296. /package/{src/tailwind → tailwind}/plugin.js +0 -0
  297. /package/{src/tailwind → tailwind}/preset.js +0 -0
  298. /package/{src/tailwind → tailwind}/update-tailwind-classes.js +0 -0
package/icons/Icon.vue ADDED
@@ -0,0 +1,28 @@
1
+ <script setup lang="ts">
2
+ import { onMounted } from 'vue';
3
+
4
+ const props = defineProps<{ name: string }>()
5
+
6
+ onMounted(() => {
7
+ if (!document.getElementById('lucide-sprite')) {
8
+ console.warn(
9
+ 'Lucide sprite not found! Make sure to use the spritePlugin.'
10
+ )
11
+ }
12
+ })
13
+ </script>
14
+
15
+ <template>
16
+ <svg
17
+ width="24"
18
+ height="24"
19
+ viewBox="0 0 24 24"
20
+ fill="none"
21
+ stroke="currentColor"
22
+ stroke-width="1.5"
23
+ stroke-linecap="round"
24
+ stroke-linejoin="round"
25
+ >
26
+ <use :href="`#${props.name}`" />
27
+ </svg>
28
+ </template>
@@ -0,0 +1,126 @@
1
+ <script setup lang="ts">
2
+ import { ref, reactive } from 'vue'
3
+ import IconPicker from './IconPicker.vue'
4
+
5
+ const basicValue = ref(null)
6
+ const preselectedValue = ref('star')
7
+ const disabledValue = ref('')
8
+
9
+ const state = reactive({
10
+ disabled: false,
11
+ placeholder: 'Select an icon...',
12
+ openOnClick: true,
13
+ openOnFocus: true,
14
+ placement: 'start',
15
+ })
16
+ </script>
17
+
18
+ <template>
19
+ <Story title="IconPicker" :layout="{ type: 'grid', width: 400 }">
20
+ <Variant title="Basic Usage">
21
+ <div class="p-4">
22
+ <label class="block text-sm font-medium mb-2">Basic Icon Picker</label>
23
+ <IconPicker
24
+ v-model="basicValue"
25
+ :placeholder="state.placeholder"
26
+ :disabled="state.disabled"
27
+ :open-on-click="state.openOnClick"
28
+ :open-on-focus="state.openOnFocus"
29
+ :placement="state.placement"
30
+ />
31
+ <div class="mt-2 text-sm text-gray-600">
32
+ Selected: {{ basicValue || 'None' }}
33
+ </div>
34
+ </div>
35
+ </Variant>
36
+
37
+ <Variant title="Subtle Variant (Default)">
38
+ <div class="p-4">
39
+ <label class="block text-sm font-medium mb-2">Subtle Variant</label>
40
+ <IconPicker
41
+ variant="subtle"
42
+ v-model="basicValue"
43
+ :placeholder="state.placeholder"
44
+ :disabled="state.disabled"
45
+ />
46
+ <div class="mt-2 text-sm text-gray-600">
47
+ Selected: {{ basicValue || 'None' }}
48
+ </div>
49
+ </div>
50
+ </Variant>
51
+
52
+ <Variant title="Outline Variant">
53
+ <div class="p-4">
54
+ <label class="block text-sm font-medium mb-2">Outline Variant</label>
55
+ <IconPicker
56
+ variant="outline"
57
+ v-model="basicValue"
58
+ :placeholder="state.placeholder"
59
+ :disabled="state.disabled"
60
+ />
61
+ <div class="mt-2 text-sm text-gray-600">
62
+ Selected: {{ basicValue || 'None' }}
63
+ </div>
64
+ </div>
65
+ </Variant>
66
+
67
+ <Variant title="Ghost Variant">
68
+ <div class="p-4">
69
+ <label class="block text-sm font-medium mb-2">Ghost Variant</label>
70
+ <IconPicker
71
+ variant="ghost"
72
+ v-model="basicValue"
73
+ :placeholder="state.placeholder"
74
+ :disabled="state.disabled"
75
+ />
76
+ <div class="mt-2 text-sm text-gray-600">
77
+ Selected: {{ basicValue || 'None' }}
78
+ </div>
79
+ </div>
80
+ </Variant>
81
+
82
+ <Variant title="Pre-selected Icon">
83
+ <div class="p-4">
84
+ <label class="block text-sm font-medium mb-2">Pre-selected Icon</label>
85
+ <IconPicker
86
+ v-model="preselectedValue"
87
+ :placeholder="state.placeholder"
88
+ :disabled="state.disabled"
89
+ />
90
+ <div class="mt-2 text-sm text-gray-600">
91
+ Selected: {{ preselectedValue || 'None' }}
92
+ </div>
93
+ </div>
94
+ </Variant>
95
+
96
+ <Variant title="Disabled State">
97
+ <div class="p-4">
98
+ <label class="block text-sm font-medium mb-2">Disabled Icon Picker</label>
99
+ <IconPicker
100
+ v-model="disabledValue"
101
+ placeholder="This is disabled"
102
+ :disabled="true"
103
+ />
104
+ <div class="mt-2 text-sm text-gray-600">
105
+ Icon picker is disabled
106
+ </div>
107
+ </div>
108
+ </Variant>
109
+
110
+ <template #controls>
111
+ <HstText v-model="state.placeholder" title="Placeholder" />
112
+ <HstCheckbox v-model="state.disabled" title="Disabled" />
113
+ <HstCheckbox v-model="state.openOnClick" title="Open on Click" />
114
+ <HstCheckbox v-model="state.openOnFocus" title="Open on Focus" />
115
+ <HstSelect
116
+ v-model="state.placement"
117
+ title="Placement"
118
+ :options="[
119
+ { value: 'start', label: 'Start' },
120
+ { value: 'center', label: 'Center' },
121
+ { value: 'end', label: 'End' }
122
+ ]"
123
+ />
124
+ </template>
125
+ </Story>
126
+ </template>
@@ -0,0 +1,221 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ ComboboxAnchor,
4
+ ComboboxContent,
5
+ ComboboxEmpty,
6
+ ComboboxInput,
7
+ ComboboxPortal,
8
+ ComboboxRoot,
9
+ ComboboxTrigger,
10
+ ComboboxViewport,
11
+ } from 'reka-ui'
12
+ import { computed, onMounted, ref, watch } from 'vue'
13
+ import Icon from './Icon.vue'
14
+
15
+ export interface IconPickerProps {
16
+ variant?: 'subtle' | 'outline' | 'ghost'
17
+ modelValue?: string | null
18
+ placeholder?: string
19
+ disabled?: boolean
20
+ openOnFocus?: boolean
21
+ openOnClick?: boolean
22
+ placement?: 'start' | 'center' | 'end'
23
+ maxIcons?: number
24
+ }
25
+
26
+ const props = withDefaults(defineProps<IconPickerProps>(), {
27
+ variant: 'subtle',
28
+ openOnClick: true,
29
+ openOnFocus: true,
30
+ maxIcons: 100,
31
+ })
32
+
33
+ const emit = defineEmits(['update:modelValue', 'focus', 'blur', 'input'])
34
+
35
+ const searchTerm = ref(getLabel(props.modelValue || ''))
36
+ const internalModelValue = ref(props.modelValue)
37
+ const isOpen = ref(false)
38
+ const iconNames = ref<string[]>([])
39
+
40
+ watch(
41
+ () => props.modelValue,
42
+ (newValue) => {
43
+ internalModelValue.value = newValue
44
+ searchTerm.value = newValue ? getLabel(newValue) : ''
45
+ },
46
+ )
47
+
48
+ onMounted(() => {
49
+ const spriteContainer = document.getElementById('lucide-sprite')
50
+ if (!spriteContainer) {
51
+ console.warn('Lucide sprite not found! Make sure to use the spritePlugin.')
52
+ return
53
+ }
54
+
55
+ const symbols = spriteContainer.getElementsByTagName('symbol')
56
+ const names: string[] = []
57
+ for (let i = 0; i < symbols.length; i++) {
58
+ const symbol = symbols[i]
59
+ names.push(symbol.id)
60
+ }
61
+ iconNames.value = names
62
+ })
63
+
64
+ function getLabel(name: string) {
65
+ return name.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase())
66
+ }
67
+
68
+ const filteredIcons = computed(() => {
69
+ if (!searchTerm.value) return iconNames.value
70
+ const lowerSearch = searchTerm.value.toLowerCase()
71
+ return iconNames.value.filter((name) =>
72
+ name.replace(/-/g, ' ').toLowerCase().includes(lowerSearch),
73
+ )
74
+ })
75
+
76
+ const onUpdateModelValue = (value: string | null) => {
77
+ internalModelValue.value = value
78
+ emit('update:modelValue', value)
79
+ searchTerm.value = value ? getLabel(value) : ''
80
+ isOpen.value = false
81
+ }
82
+
83
+ const handleInputChange = (event: Event) => {
84
+ const target = event.target as HTMLInputElement
85
+ searchTerm.value = target.value
86
+
87
+ if (searchTerm.value === '') {
88
+ internalModelValue.value = null
89
+ emit('update:modelValue', null)
90
+ }
91
+ emit('input', searchTerm.value)
92
+ }
93
+
94
+ const handleOpenChange = (open: boolean) => {
95
+ isOpen.value = open
96
+ if (!open) {
97
+ searchTerm.value = internalModelValue.value
98
+ ? getLabel(internalModelValue.value)
99
+ : ''
100
+ }
101
+ }
102
+
103
+ const handleClick = (event: MouseEvent) => {
104
+ if (props.openOnClick) {
105
+ isOpen.value = true
106
+ }
107
+ }
108
+
109
+ const handleFocus = (event: FocusEvent) => {
110
+ if (props.openOnFocus) {
111
+ isOpen.value = true
112
+ }
113
+ emit('focus', event)
114
+ }
115
+
116
+ const handleBlur = (event: FocusEvent) => {
117
+ emit('blur', event)
118
+ }
119
+
120
+ const handleIconClick = (iconName: string) => {
121
+ onUpdateModelValue(iconName)
122
+ }
123
+
124
+ const reset = () => {
125
+ searchTerm.value = ''
126
+ internalModelValue.value = null
127
+ emit('update:modelValue', null)
128
+ }
129
+
130
+ const variantClasses = computed(() => {
131
+ const borderCss =
132
+ 'border focus-within:border-outline-gray-4 focus-within:ring-2 focus-within:ring-outline-gray-3'
133
+
134
+ return {
135
+ subtle: `${borderCss} bg-surface-gray-2 hover:bg-surface-gray-3 border-transparent`,
136
+ outline: `${borderCss} border-outline-gray-2`,
137
+ ghost: '',
138
+ }[props.variant]
139
+ })
140
+
141
+ defineExpose({
142
+ reset,
143
+ })
144
+ </script>
145
+
146
+ <template>
147
+ <div class="relative">
148
+ <ComboboxRoot
149
+ :model-value="internalModelValue"
150
+ @update:modelValue="onUpdateModelValue"
151
+ @update:open="handleOpenChange"
152
+ :ignore-filter="true"
153
+ :open="isOpen"
154
+ >
155
+ <ComboboxAnchor
156
+ class="flex h-7 w-full items-center justify-between gap-2 rounded px-2 py-1 transition-colors"
157
+ :class="{
158
+ 'opacity-50 pointer-events-none': disabled,
159
+ [variantClasses]: true,
160
+ }"
161
+ @click="handleClick"
162
+ >
163
+ <div class="flex items-center gap-2 flex-1 overflow-hidden">
164
+ <Icon
165
+ :name="internalModelValue || 'circle-dashed'"
166
+ class="w-4 h-4 flex-shrink-0"
167
+ />
168
+ <ComboboxInput
169
+ :value="searchTerm"
170
+ @input="handleInputChange"
171
+ @focus="handleFocus"
172
+ @blur="handleBlur"
173
+ class="bg-transparent p-0 focus:outline-0 border-0 focus:border-0 focus:ring-0 text-base text-ink-gray-8 h-full placeholder:text-ink-gray-4 w-full"
174
+ :placeholder="placeholder || 'Select an icon...'"
175
+ :disabled="disabled"
176
+ autocomplete="off"
177
+ />
178
+ </div>
179
+ <ComboboxTrigger :disabled="disabled">
180
+ <Icon name="chevron-down" class="h-4 w-4 text-ink-gray-5" />
181
+ </ComboboxTrigger>
182
+ </ComboboxAnchor>
183
+ <ComboboxPortal>
184
+ <ComboboxContent
185
+ class="z-10 w-60 mt-1 bg-surface-modal overflow-hidden rounded-lg shadow-2xl"
186
+ position="popper"
187
+ @openAutoFocus.prevent
188
+ @closeAutoFocus.prevent
189
+ :align="props.placement || 'start'"
190
+ >
191
+ <ComboboxViewport class="max-h-60 overflow-auto p-2">
192
+ <ComboboxEmpty
193
+ v-if="filteredIcons.length === 0"
194
+ class="text-ink-gray-5 text-base text-center py-1.5 px-2.5"
195
+ >
196
+ <template v-if="searchTerm">
197
+ No icons found for "{{ searchTerm }}"
198
+ </template>
199
+ <template v-else> No icons available. </template>
200
+ </ComboboxEmpty>
201
+ <div v-if="filteredIcons.length > 0" class="flex flex-wrap">
202
+ <button
203
+ v-for="iconName in filteredIcons.slice(0, props.maxIcons)"
204
+ :key="iconName"
205
+ @click="handleIconClick(iconName)"
206
+ type="button"
207
+ class="w-8 h-8 flex items-center justify-center rounded hover:bg-surface-gray-3 transition-colors"
208
+ :class="{
209
+ 'bg-surface-gray-3': internalModelValue === iconName,
210
+ }"
211
+ :title="getLabel(iconName)"
212
+ >
213
+ <Icon :name="iconName" class="w-4 h-4" />
214
+ </button>
215
+ </div>
216
+ </ComboboxViewport>
217
+ </ComboboxContent>
218
+ </ComboboxPortal>
219
+ </ComboboxRoot>
220
+ </div>
221
+ </template>
package/icons/index.ts CHANGED
@@ -8,3 +8,8 @@ export { default as LightningIcon } from './LightningIcon.vue'
8
8
  export { default as MaximizeIcon } from './MaximizeIcon.vue'
9
9
  export { default as MinimizeIcon } from './MinimizeIcon.vue'
10
10
  export { default as StepsIcon } from './StepsIcon.vue'
11
+
12
+ // Lucide Icons
13
+ export { default as Icon } from './Icon.vue'
14
+ export { default as IconPicker } from './IconPicker.vue'
15
+ export { default as spritePlugin } from './spritePlugin'
@@ -0,0 +1,13 @@
1
+ // @ts-ignore
2
+ import sprite from 'lucide-static/sprite.svg?raw'
3
+ import type { App } from 'vue'
4
+
5
+ export default {
6
+ install(app: App) {
7
+ const div = document.createElement('div')
8
+ div.id = 'lucide-sprite'
9
+ div.style.display = 'none'
10
+ div.innerHTML = sprite
11
+ document.body.prepend(div)
12
+ },
13
+ }
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="w-[85%] lg:w-[700px] mx-auto py-12 space-y-8">
2
+ <div class="w-[85%] lg:w-[700px] mx-auto py-12 space-y-8 text-base">
3
3
  <div class="flex justify-between">
4
4
  <div class="space-y-2">
5
5
  <div class="text-lg font-semibold text-ink-gray-9">
@@ -10,7 +10,7 @@
10
10
  {{ data?.status }}
11
11
  </Badge>
12
12
  </div>
13
- <div class="leading-5">
13
+ <div class="leading-5 text-ink-gray-7">
14
14
  Change the mapping of columns from your file to fields in the system
15
15
  </div>
16
16
  </div>
@@ -17,7 +17,7 @@
17
17
  variant="solid" @click="startImport" />
18
18
  <Button v-else-if="listRoute" label="Done" @click="redirectToList()" />
19
19
  </div>
20
- <div class="leading-5">
20
+ <div class="leading-5 text-ink-gray-7">
21
21
  Verify the data before starting the import process
22
22
  </div>
23
23
  </div>
@@ -26,7 +26,7 @@
26
26
  <div class="text-ink-gray-5 text-sm">
27
27
  Column Mapping
28
28
  </div>
29
- <div class="border rounded-md bg-surface-gray-2 p-4 space-y-4 text-sm">
29
+ <div class="border rounded-md bg-surface-gray-2 p-4 space-y-4 text-sm text-ink-gray-7">
30
30
  <div v-for="map in mapping" class="grid grid-cols-[40%,10%,40%] lg:grid-cols-3 space-x-3 items-center">
31
31
  <div class="">
32
32
  {{ map[0] }}
@@ -41,6 +41,18 @@
41
41
  </div>
42
42
  </div>
43
43
 
44
+ <div v-if="warnings.length" class="space-y-2">
45
+ <div class="text-ink-gray-5 text-sm">
46
+ Warnings
47
+ </div>
48
+ <div class="rounded-md bg-surface-amber-2 p-2 space-y-2 text-xs">
49
+ <div v-for="warning in warnings" class="flex items-center space-x-2">
50
+ <FeatherIcon name="alert-circle" class="size-3 text-ink-amber-3" />
51
+ <div v-html="warning.message" class="text-ink-amber-3"></div>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
44
56
  <div v-if="preview?.data?.length" class="border rounded-md overflow-x-auto">
45
57
  <table class="divide-y">
46
58
  <thead class="rounded-t-md">
@@ -325,6 +337,10 @@ const mapping = computed(() => {
325
337
  return warningMap;
326
338
  })
327
339
 
340
+ const warnings = computed(() => {
341
+ return preview.value?.warnings?.filter((warning: any) => warning.type != "info") || [];
342
+ })
343
+
328
344
  const listRoute = computed(() => {
329
345
  return props.doctypeMap[props.data.reference_doctype]?.listRoute
330
346
  })
@@ -38,7 +38,7 @@
38
38
  class="hidden"
39
39
  @change="(e) => uploadFile(e)"
40
40
  />
41
- <div class="leading-5">
41
+ <div class="leading-5 text-ink-gray-9">
42
42
  Drag and drop a CSV file, or upload from your
43
43
  <span @click="openFileSelector" class="cursor-pointer font-semibold hover:underline">Device</span>
44
44
  or
@@ -67,7 +67,7 @@
67
67
  <div v-else-if="importFile" class="h-[300px] flex items-center justify-center bg-surface-gray-1 border border-dashed border-outline-gray-3 rounded-md">
68
68
  <div class="w-4/5 lg:w-2/5 bg-surface-white border rounded-md p-2 flex items-center justify-between items-center">
69
69
  <div class="space-y-2">
70
- <div class="font-medium leading-5">
70
+ <div class="font-medium leading-5 text-ink-gray-9">
71
71
  {{ importFile.file_name || importFile.split("/").pop() }}
72
72
  </div>
73
73
  <div v-if="importFile.file_size" class="text-ink-gray-6">
@@ -98,6 +98,7 @@ const filterCount = computed(() =>
98
98
  <Popover
99
99
  popover-class="mt-2 p-2 rounded-lg border bg-surface-modal shadow-xl max-w-xl"
100
100
  placement="bottom-end"
101
+ :matchTargetWidth="true"
101
102
  >
102
103
  <template #target="{ close, togglePopover }">
103
104
  <Button
@@ -140,7 +140,7 @@ export const getValueControl = (row: StateRow) => {
140
140
  }
141
141
 
142
142
  if (typeSelect.includes(fieldType) || typeCheck.includes(fieldType)) {
143
- let _options = options || ['yes', 'no']
143
+ let _options = options || ['Yes', 'No']
144
144
 
145
145
  return h(Select, { placeholder: 'Select Option', options: _options })
146
146
  }
@@ -225,9 +225,10 @@ export const parseFilters = (filters: any) => {
225
225
 
226
226
  return _filters.map(transformIn).reduce((acc, cur) => {
227
227
  if (['equals', '='].includes(cur.operator)) {
228
- cur.value = cur.toBoolean ? 'Yes' : cur.value
229
- } //
230
- else if (cur.operator === 'between') cur.value = [...cur.value.split(',')]
228
+ cur.value = cur.value == 'Yes' ? true : cur.value == 'No' ? false : cur.value
229
+ } else if (cur.operator === 'between') {
230
+ cur.value = [...cur.value.split(',')]
231
+ }
231
232
 
232
233
  return [
233
234
  ...acc,
@@ -0,0 +1,47 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import { useRouter } from 'vue-router'
4
+
5
+ const router = useRouter()
6
+
7
+ router.afterEach(() => {
8
+ open.value = false
9
+ })
10
+
11
+ defineProps<{
12
+ apps: Array<{
13
+ title: string
14
+ logo: string
15
+ route: string
16
+ }>
17
+ }>()
18
+
19
+ const open = ref(false)
20
+ </script>
21
+
22
+ <template>
23
+ <div class="fixed left-0 top-0 h-screen w-3 z-40" @mouseenter="open = true" />
24
+ <aside
25
+ class="fixed left-0 top-0 h-screen z-50 transition-transform duration-300 ease-out bg-surface-white border-r border-gray-200 px-2"
26
+ :class="!open && '-translate-x-full'"
27
+ @mouseleave="open = false"
28
+ >
29
+ <div class="flex h-full items-center justify-center">
30
+ <div class="flex flex-col gap-6">
31
+ <a
32
+ v-for="app in apps"
33
+ :key="app.route"
34
+ :href="app.route"
35
+ :title="app.title"
36
+ class="group flex items-center justify-center rounded-md hover:shadow-sm transition"
37
+ >
38
+ <img
39
+ :src="app.logo"
40
+ :alt="app.title"
41
+ class="size-7 opacity-80 group-hover:opacity-100"
42
+ />
43
+ </a>
44
+ </div>
45
+ </div>
46
+ </aside>
47
+ </template>
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <svg
3
+ width="118"
4
+ height="118"
5
+ viewBox="0 0 118 118"
6
+ fill="none"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ >
9
+ <path
10
+ d="M93.9278 0H23.1013C10.3428 0 0 10.3428 0 23.1013V93.9278C0 106.686 10.3428 117.029 23.1013 117.029H93.9278C106.686 117.029 117.029 106.686 117.029 93.9278V23.1013C117.029 10.3428 106.686 0 93.9278 0Z"
11
+ fill="#016E7D"
12
+ />
13
+ <path
14
+ d="M80.1723 35.7545H59.7487L55.7059 28.2466H20.8965V38.7472H49.4056L53.4483 46.2551H82.955C83.9525 46.2551 84.7926 47.0951 84.7926 48.0927V76.4968C84.7926 77.4943 83.9525 78.3344 82.955 78.3344H33.2347C32.2371 78.3344 31.3971 77.4943 31.3971 76.4968V50.5603H20.8965V73.6616C20.8965 82.0096 27.6694 88.835 36.0173 88.835H80.1723C88.5203 88.835 95.2932 82.0621 95.2932 73.6616V50.8754C95.2932 42.5274 88.5203 35.702 80.1723 35.702V35.7545Z"
15
+ fill="#EEFBFF"
16
+ />
17
+ </svg>
18
+ </template>