@witchcraft/ui 0.0.1 → 0.1.1

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 (224) hide show
  1. package/README.md +18 -28
  2. package/dist/module.d.mts +3 -1
  3. package/dist/module.json +3 -3
  4. package/dist/module.mjs +21 -12
  5. package/dist/runtime/assets/base.css +1 -1
  6. package/dist/runtime/assets/locales/en.json +2 -2
  7. package/dist/runtime/assets/tailwind.css +1 -1
  8. package/dist/runtime/assets/utils.css +1 -0
  9. package/dist/runtime/build/WitchcraftUiResolver.js +1 -1
  10. package/dist/runtime/components/Aria/Aria.vue +5 -9
  11. package/dist/runtime/components/Aria/Aria.vue.d.ts +5 -0
  12. package/dist/runtime/components/Icon/Icon.vue +12 -28
  13. package/dist/runtime/components/Icon/Icon.vue.d.ts +21 -0
  14. package/dist/runtime/components/LibButton/LibButton.vue +93 -117
  15. package/dist/runtime/components/LibButton/LibButton.vue.d.ts +36 -0
  16. package/dist/runtime/components/LibCheckbox/LibCheckbox.vue +53 -76
  17. package/dist/runtime/components/LibCheckbox/LibCheckbox.vue.d.ts +42 -0
  18. package/dist/runtime/components/LibColorInput/LibColorInput.vue +131 -101
  19. package/dist/runtime/components/LibColorInput/LibColorInput.vue.d.ts +63 -0
  20. package/dist/runtime/components/LibColorPicker/LibColorPicker.vue +326 -296
  21. package/dist/runtime/components/LibColorPicker/LibColorPicker.vue.d.ts +61 -0
  22. package/dist/runtime/components/LibColorPicker/utils/safeConvertToHsva.d.ts +2 -0
  23. package/dist/runtime/components/LibColorPicker/utils/safeConvertToHsva.js +18 -0
  24. package/dist/runtime/components/LibColorPicker/utils/safeConvertToRgba.d.ts +2 -0
  25. package/dist/runtime/components/LibColorPicker/utils/safeConvertToRgba.js +17 -0
  26. package/dist/runtime/components/LibColorPicker/utils/toLowPrecisionRgbaString.d.ts +2 -0
  27. package/dist/runtime/components/LibColorPicker/utils/toLowPrecisionRgbaString.js +8 -0
  28. package/dist/runtime/components/LibColorPicker/utils/truncate.d.ts +1 -0
  29. package/dist/runtime/components/LibColorPicker/utils/truncate.js +5 -0
  30. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue +42 -64
  31. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue.d.ts +22 -0
  32. package/dist/runtime/components/LibDatePicker/LibDatePicker.vue +20 -54
  33. package/dist/runtime/components/LibDatePicker/LibDatePicker.vue.d.ts +40 -0
  34. package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.vue +205 -173
  35. package/dist/runtime/components/LibDatePicker/LibRangeDatePicker.vue.d.ts +34 -0
  36. package/dist/runtime/components/LibDatePicker/LibSingleDatePicker.vue +215 -164
  37. package/dist/runtime/components/LibDatePicker/LibSingleDatePicker.vue.d.ts +34 -0
  38. package/dist/runtime/components/LibDatePicker/LibTimeZonePicker.vue +9 -10
  39. package/dist/runtime/components/LibDatePicker/LibTimeZonePicker.vue.d.ts +22 -0
  40. package/dist/runtime/components/LibDebug/LibDebug.vue +47 -65
  41. package/dist/runtime/components/LibDebug/LibDebug.vue.d.ts +32 -0
  42. package/dist/runtime/components/LibDevOnly/LibDevOnly.vue +19 -34
  43. package/dist/runtime/components/LibDevOnly/LibDevOnly.vue.d.ts +22 -0
  44. package/dist/runtime/components/LibFileInput/LibFileInput.vue +155 -173
  45. package/dist/runtime/components/LibFileInput/LibFileInput.vue.d.ts +43 -0
  46. package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue +352 -0
  47. package/dist/runtime/components/LibInputDeprecated/LibInputDeprecated.vue.d.ts +165 -0
  48. package/dist/runtime/components/LibLabel/LibLabel.vue +30 -46
  49. package/dist/runtime/components/LibLabel/LibLabel.vue.d.ts +27 -0
  50. package/dist/runtime/components/LibMultiValues/LibMultiValues.vue +50 -66
  51. package/dist/runtime/components/LibMultiValues/LibMultiValues.vue.d.ts +29 -0
  52. package/dist/runtime/components/LibNotifications/LibNotification.vue +48 -56
  53. package/dist/runtime/components/LibNotifications/LibNotification.vue.d.ts +17 -0
  54. package/dist/runtime/components/LibNotifications/LibNotifications.vue +71 -83
  55. package/dist/runtime/components/LibNotifications/LibNotifications.vue.d.ts +13 -0
  56. package/dist/runtime/components/LibPagination/LibPagination.vue +86 -131
  57. package/dist/runtime/components/LibPagination/LibPagination.vue.d.ts +104 -0
  58. package/dist/runtime/components/LibPalette/LibPalette.vue +23 -26
  59. package/dist/runtime/components/LibPalette/LibPalette.vue.d.ts +14 -0
  60. package/dist/runtime/components/LibPopup/LibPopup.vue +326 -400
  61. package/dist/runtime/components/LibPopup/LibPopup.vue.d.ts +46 -0
  62. package/dist/runtime/components/LibProgressBar/LibProgressBar.vue +73 -93
  63. package/dist/runtime/components/LibProgressBar/LibProgressBar.vue.d.ts +41 -0
  64. package/dist/runtime/components/LibRecorder/LibRecorder.vue +134 -179
  65. package/dist/runtime/components/LibRecorder/LibRecorder.vue.d.ts +77 -0
  66. package/dist/runtime/components/LibRoot/LibRoot.vue +75 -89
  67. package/dist/runtime/components/LibRoot/LibRoot.vue.d.ts +41 -0
  68. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.vue +51 -82
  69. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.vue.d.ts +35 -0
  70. package/dist/runtime/components/LibSuggestions/LibSuggestions.vue +147 -164
  71. package/dist/runtime/components/LibSuggestions/LibSuggestions.vue.d.ts +94 -0
  72. package/dist/runtime/components/LibTable/LibTable.vue +69 -106
  73. package/dist/runtime/components/LibTable/LibTable.vue.d.ts +45 -0
  74. package/dist/runtime/components/Template/NAME.vue +15 -36
  75. package/dist/runtime/components/Template/NAME.vue.d.ts +17 -0
  76. package/dist/runtime/components/TestControls/TestControls.vue +7 -10
  77. package/dist/runtime/components/TestControls/TestControls.vue.d.ts +5 -0
  78. package/dist/runtime/components/index.d.ts +12 -11
  79. package/dist/runtime/components/index.js +12 -11
  80. package/dist/runtime/components/shared/props.d.ts +81 -16
  81. package/dist/runtime/components/shared/storyHelpers/playInput.js +5 -5
  82. package/dist/runtime/components/shared/storyHelpers/playSuggestions.js +15 -11
  83. package/dist/runtime/composables/index.d.ts +5 -0
  84. package/dist/runtime/composables/index.js +5 -0
  85. package/dist/runtime/composables/useDivideAttrs.js +1 -0
  86. package/dist/runtime/composables/useDragWithThreshold.d.ts +71 -0
  87. package/dist/runtime/composables/useDragWithThreshold.js +40 -0
  88. package/dist/runtime/composables/usePreHydrationValue.d.ts +12 -0
  89. package/dist/runtime/composables/usePreHydrationValue.js +15 -0
  90. package/dist/runtime/composables/useSetupI18n.d.ts +2 -0
  91. package/dist/runtime/composables/useSetupI18n.js +5 -1
  92. package/dist/runtime/composables/useSuggestions.d.ts +7 -5
  93. package/dist/runtime/composables/useSuggestions.js +94 -57
  94. package/dist/runtime/directives/vResizableCols.js +92 -84
  95. package/dist/runtime/helpers/NotificationHandler.d.ts +5 -0
  96. package/dist/runtime/helpers/index.d.ts +3 -1
  97. package/dist/runtime/helpers/index.js +3 -1
  98. package/dist/runtime/types/index.d.ts +6 -0
  99. package/dist/runtime/utils/notifyIfError.d.ts +14 -0
  100. package/dist/runtime/utils/notifyIfError.js +29 -0
  101. package/dist/types.d.mts +2 -6
  102. package/package.json +27 -29
  103. package/src/module.ts +31 -12
  104. package/src/runtime/assets/base.css +10 -1
  105. package/src/runtime/assets/locales/en.json +2 -2
  106. package/src/runtime/assets/tailwind.css +1 -1
  107. package/src/runtime/assets/{style.css → utils.css} +86 -4
  108. package/src/runtime/build/WitchcraftUiResolver.ts +1 -1
  109. package/src/runtime/components/Focus.stories.ts +3 -2
  110. package/src/runtime/components/Icon/Icon.vue +10 -6
  111. package/src/runtime/components/LibButton/LibButton.vue +41 -47
  112. package/src/runtime/components/LibCheckbox/LibCheckbox.vue +7 -4
  113. package/src/runtime/components/LibColorInput/LibColorInput.vue +111 -37
  114. package/src/runtime/components/LibColorPicker/LibColorPicker.stories.ts +25 -4
  115. package/src/runtime/components/LibColorPicker/LibColorPicker.vue +242 -131
  116. package/src/runtime/components/LibColorPicker/utils/safeConvertToHsva.ts +24 -0
  117. package/src/runtime/components/LibColorPicker/utils/safeConvertToRgba.ts +23 -0
  118. package/src/runtime/components/LibColorPicker/utils/toLowPrecisionRgbaString.ts +13 -0
  119. package/src/runtime/components/LibColorPicker/utils/truncate.ts +6 -0
  120. package/src/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.ts +1 -1
  121. package/src/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.vue +11 -9
  122. package/src/runtime/components/LibDatePicker/LibDatePicker.vue +4 -17
  123. package/src/runtime/components/LibDatePicker/LibRangeDatePicker.vue +192 -131
  124. package/src/runtime/components/LibDatePicker/LibSingleDatePicker.vue +183 -115
  125. package/src/runtime/components/LibDatePicker/LibTimeZonePicker.vue +3 -3
  126. package/src/runtime/components/LibDebug/LibDebug.vue +15 -5
  127. package/src/runtime/components/LibDevOnly/LibDevOnly.vue +1 -3
  128. package/src/runtime/components/LibFileInput/LibFileInput.vue +54 -29
  129. package/src/runtime/components/{LibInput/LibInput.stories.ts → LibInputDeprecated/LibInputDeprecated.stories.ts} +64 -19
  130. package/{dist/runtime/components/LibInput/LibInput.vue → src/runtime/components/LibInputDeprecated/LibInputDeprecated.vue} +40 -34
  131. package/src/runtime/components/LibLabel/LibLabel.vue +2 -2
  132. package/src/runtime/components/LibMultiValues/LibMultiValues.stories.ts +5 -4
  133. package/src/runtime/components/LibMultiValues/LibMultiValues.vue +11 -13
  134. package/src/runtime/components/LibNotifications/LibNotification.vue +19 -11
  135. package/src/runtime/components/LibNotifications/LibNotifications.stories.ts +2 -2
  136. package/src/runtime/components/LibNotifications/LibNotifications.vue +20 -12
  137. package/src/runtime/components/LibPagination/LibPagination.stories.ts +2 -2
  138. package/src/runtime/components/LibPagination/LibPagination.vue +19 -20
  139. package/src/runtime/components/LibPalette/LibPalette.vue +3 -3
  140. package/src/runtime/components/LibPopup/LibPopup.stories.ts +2 -2
  141. package/src/runtime/components/LibPopup/LibPopup.vue +30 -67
  142. package/src/runtime/components/LibProgressBar/LibProgressBar.vue +3 -2
  143. package/src/runtime/components/LibRecorder/LibRecorder.vue +2 -3
  144. package/src/runtime/components/LibRoot/LibRoot.vue +14 -1
  145. package/src/runtime/components/LibSimpleInput/LibSimpleInput.stories.ts +1 -1
  146. package/src/runtime/components/LibSimpleInput/LibSimpleInput.vue +5 -8
  147. package/src/runtime/components/LibSuggestions/LibSuggestions.vue +42 -26
  148. package/src/runtime/components/LibTable/LibTable.vue +8 -9
  149. package/src/runtime/components/Scrolling.stories.ts +58 -0
  150. package/src/runtime/components/Template/NAME.vue +1 -1
  151. package/src/runtime/components/TestControls/TestControls.vue +1 -1
  152. package/src/runtime/components/index.ts +12 -12
  153. package/src/runtime/components/shared/props.ts +82 -19
  154. package/src/runtime/components/shared/storyHelpers/playInput.ts +6 -5
  155. package/src/runtime/components/shared/storyHelpers/playSuggestions.ts +25 -11
  156. package/src/runtime/composables/index.ts +5 -0
  157. package/src/runtime/composables/useDarkMode.ts +2 -2
  158. package/src/runtime/composables/useDivideAttrs.ts +1 -0
  159. package/src/runtime/composables/useDragWithThreshold.ts +108 -0
  160. package/src/runtime/composables/usePreHydrationValue.ts +30 -0
  161. package/src/runtime/composables/useSetupI18n.ts +8 -2
  162. package/src/runtime/composables/useSuggestions.ts +92 -45
  163. package/src/runtime/directives/vResizableCols.ts +82 -74
  164. package/src/runtime/helpers/NotificationHandler.ts +5 -0
  165. package/src/runtime/helpers/index.ts +3 -1
  166. package/src/runtime/types/index.ts +5 -0
  167. package/src/runtime/utils/notifyIfError.ts +45 -0
  168. package/dist/module.cjs +0 -5
  169. package/dist/module.d.ts +0 -34
  170. package/dist/runtime/assets/style.css +0 -1
  171. package/dist/runtime/components/Focus.stories.d.ts +0 -11
  172. package/dist/runtime/components/Focus.stories.js +0 -53
  173. package/dist/runtime/components/LibButton/LibButton.stories.d.ts +0 -12
  174. package/dist/runtime/components/LibButton/LibButton.stories.js +0 -94
  175. package/dist/runtime/components/LibCheckbox/LibCheckbox.stories.d.ts +0 -14
  176. package/dist/runtime/components/LibCheckbox/LibCheckbox.stories.js +0 -29
  177. package/dist/runtime/components/LibColorInput/LibColorInput.stories.d.ts +0 -7
  178. package/dist/runtime/components/LibColorInput/LibColorInput.stories.js +0 -58
  179. package/dist/runtime/components/LibColorPicker/LibColorPicker.stories.d.ts +0 -7
  180. package/dist/runtime/components/LibColorPicker/LibColorPicker.stories.js +0 -51
  181. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.d.ts +0 -7
  182. package/dist/runtime/components/LibDarkModeSwitcher/LibDarkModeSwitcher.stories.js +0 -36
  183. package/dist/runtime/components/LibDatePicker/LibDatePicker.stories.d.ts +0 -11
  184. package/dist/runtime/components/LibDatePicker/LibDatePicker.stories.js +0 -98
  185. package/dist/runtime/components/LibDebug/LibDebug.stories.d.ts +0 -9
  186. package/dist/runtime/components/LibDebug/LibDebug.stories.js +0 -46
  187. package/dist/runtime/components/LibFileInput/LibFileInput.stories.d.ts +0 -10
  188. package/dist/runtime/components/LibFileInput/LibFileInput.stories.js +0 -63
  189. package/dist/runtime/components/LibInput/LibInput.stories.d.ts +0 -33
  190. package/dist/runtime/components/LibInput/LibInput.stories.js +0 -339
  191. package/dist/runtime/components/LibLabel/LibLabel.stories.d.ts +0 -6
  192. package/dist/runtime/components/LibLabel/LibLabel.stories.js +0 -25
  193. package/dist/runtime/components/LibMultiValues/LibMultiValues.stories.d.ts +0 -23
  194. package/dist/runtime/components/LibMultiValues/LibMultiValues.stories.js +0 -60
  195. package/dist/runtime/components/LibNotifications/LibNotification.stories.d.ts +0 -15
  196. package/dist/runtime/components/LibNotifications/LibNotification.stories.js +0 -126
  197. package/dist/runtime/components/LibNotifications/LibNotifications.stories.d.ts +0 -6
  198. package/dist/runtime/components/LibNotifications/LibNotifications.stories.js +0 -109
  199. package/dist/runtime/components/LibPagination/LibPagination.stories.d.ts +0 -6
  200. package/dist/runtime/components/LibPagination/LibPagination.stories.js +0 -40
  201. package/dist/runtime/components/LibPalette/LibPalette.stories.d.ts +0 -6
  202. package/dist/runtime/components/LibPalette/LibPalette.stories.js +0 -20
  203. package/dist/runtime/components/LibPopup/LibPopup.stories.d.ts +0 -14
  204. package/dist/runtime/components/LibPopup/LibPopup.stories.js +0 -147
  205. package/dist/runtime/components/LibProgressBar/LibProgressBar.stories.d.ts +0 -10
  206. package/dist/runtime/components/LibProgressBar/LibProgressBar.stories.js +0 -81
  207. package/dist/runtime/components/LibRecorder/LibRecorder.stories.d.ts +0 -19
  208. package/dist/runtime/components/LibRecorder/LibRecorder.stories.js +0 -63
  209. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.stories.d.ts +0 -26
  210. package/dist/runtime/components/LibSimpleInput/LibSimpleInput.stories.js +0 -78
  211. package/dist/runtime/components/LibSuggestions/LibSuggestions.stories.d.ts +0 -27
  212. package/dist/runtime/components/LibSuggestions/LibSuggestions.stories.js +0 -112
  213. package/dist/runtime/components/LibTable/LibTable.stories.d.ts +0 -16
  214. package/dist/runtime/components/LibTable/LibTable.stories.js +0 -156
  215. package/dist/runtime/components/reset.stories.d.ts +0 -5
  216. package/dist/runtime/components/reset.stories.js +0 -19
  217. package/dist/runtime/composables/useScrollNearContainerEdges.stories.d.ts +0 -7
  218. package/dist/runtime/composables/useScrollNearContainerEdges.stories.js +0 -85
  219. package/dist/runtime/helpers/addValue.d.ts +0 -1
  220. package/dist/runtime/helpers/addValue.js +0 -8
  221. package/dist/types.d.ts +0 -7
  222. package/src/runtime/components/LibInput/LibInput.vue +0 -372
  223. package/src/runtime/helpers/addValue.ts +0 -10
  224. /package/src/runtime/components/{reset.stories.ts → Reset.stories.ts} +0 -0
@@ -2,7 +2,7 @@
2
2
  import type { Meta, StoryObj } from "@storybook/vue3"
3
3
  import { ref, watchEffect } from "vue"
4
4
 
5
- import LibInput from "./LibInput.vue"
5
+ import LibInputDeprecated from "./LibInputDeprecated.vue"
6
6
 
7
7
  import IconFaChevronLeft from "~icons/fa6-solid/chevron-left"
8
8
  import IconFaChevronRight from "~icons/fa6-solid/chevron-right"
@@ -25,19 +25,22 @@ import {
25
25
  } from "../shared/storyHelpers/playSuggestions.js"
26
26
 
27
27
  const meta = {
28
- component: LibInput as any,
29
- title: "Components/Input",
28
+ component: LibInputDeprecated as any,
29
+ title: "Components/Combobox",
30
30
  args: {
31
31
  border: true,
32
32
  label: "Some Label",
33
+ ...{
34
+ _template: undefined,
35
+ } as any
33
36
  },
34
- } satisfies Meta<typeof LibInput> & Meta<{ custom: string }>
37
+ } satisfies Meta<typeof LibInputDeprecated> & Meta<{ custom: string }>
35
38
 
36
39
  export default meta
37
- type Story = StoryObj<typeof LibInput> // & StoryObj<typeof extraArgs>
40
+ type Story = StoryObj<typeof LibInputDeprecated> // & StoryObj<typeof extraArgs>
38
41
  const allComponents = {
39
42
  ...components,
40
- LibInput,
43
+ LibInputDeprecated,
41
44
  Icon,
42
45
  IconFaChevronRight,
43
46
  IconFaChevronLeft,
@@ -54,6 +57,7 @@ const playAutosuggestSelectLike = async (context: { canvasElement: HTMLElement,
54
57
 
55
58
  const setupModelValue = (args: any) => ({
56
59
  modelValue: ref(args.modelValue ?? ""),
60
+ inputValue: ref(args.inputValue ?? ""),
57
61
  })
58
62
 
59
63
  const setupModelValues = (args: any) => ({
@@ -64,6 +68,7 @@ const Base: Story = {
64
68
  render: args => ({
65
69
  components: allComponents,
66
70
  setup: () => ({
71
+
67
72
  ...setupModelValue(args),
68
73
  ...setupModelValues(args),
69
74
  args: {
@@ -72,15 +77,16 @@ const Base: Story = {
72
77
  },
73
78
  }),
74
79
 
75
- template: `
80
+ template: (args as any)._template ?? `
76
81
  Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
77
- <lib-input
82
+ <lib-simple-input-deprecated
78
83
  v-bind="args"
79
84
  v-model:values="values"
85
+ v-model:inputValue="inputValue"
80
86
  v-model="modelValue"
81
87
  @submit="modelValue = $event"
82
88
  >
83
- </lib-input>
89
+ </lib-simple-input-deprecated>
84
90
  `,
85
91
  }),
86
92
  }
@@ -144,6 +150,15 @@ export const WithAutosuggest = {
144
150
  },
145
151
  play: playAutosuggestSelectLike
146
152
  }
153
+
154
+ export const WithAutosuggestNoLabel = {
155
+ ...Base,
156
+ args: {
157
+ label: undefined,
158
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"],
159
+ },
160
+ play: playAutosuggestSelectLike
161
+ }
147
162
  export const WithInstantAutosuggest = {
148
163
  ...Base,
149
164
  args: {
@@ -158,6 +173,27 @@ export const AutosuggestRestricted = {
158
173
  },
159
174
  play: playAutosuggestSelectLike
160
175
  }
176
+ export const AutosuggestRestrictedWithClearOnClick = {
177
+ ...WithAutosuggest,
178
+ args: {
179
+ ...WithAutosuggest.args,
180
+ restrictToSuggestions: true,
181
+ _template: `
182
+ Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
183
+ Temp Value: <span class="inline-block" data-testid="temp-value">{{inputValue}}</span>\n
184
+ <lib-simple-input-deprecated
185
+ v-bind="args"
186
+ v-model:values="values"
187
+ v-model:inputValue="inputValue"
188
+ v-model="modelValue"
189
+ @submit="modelValue = $event"
190
+ @click="inputValue = ''"
191
+ >
192
+ </lib-simple-input-deprecated>
193
+ `
194
+ },
195
+ play: null,
196
+ }
161
197
  export const AutosuggestSelectLikeShowAllUnrestricted = {
162
198
  ...WithAutosuggest,
163
199
  args: {
@@ -198,7 +234,7 @@ export const Slots: Story = {
198
234
  template: `
199
235
  Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
200
236
 
201
- <lib-input
237
+ <lib-simple-input-deprecated
202
238
  v-bind="args"
203
239
  v-model="modelValue"
204
240
  v-model:values="values"
@@ -216,7 +252,7 @@ export const Slots: Story = {
216
252
  <icon><icon-fa-chevron-right/></icon>
217
253
  </lib-button>
218
254
  </template>
219
- </lib-input>
255
+ </lib-simple-input-deprecated>
220
256
  `,
221
257
  }),
222
258
  }
@@ -234,17 +270,17 @@ const MultipleValuesBase: Story = {
234
270
  Model Value: <span class="inline-block" data-testid="model-value">{{modelValue}}</span>\n
235
271
  <br/>
236
272
  Values: <span class="inline-block" data-testid="values">{{values.join(", ")}}</span>\n
237
- <lib-input
273
+ <lib-simple-input-deprecated
238
274
  v-bind="args"
239
275
  v-model="modelValue"
240
276
  v-model:values="values"
241
277
  >
242
278
  <template #left>
243
- <lib-button class="px-0" :border="false">
279
+ <lib-button class="px-0" :border="false" :disabled="args.disabled || args.readonly">
244
280
  <icon><icon-fa-solid-tags/></icon>
245
281
  </lib-button>
246
282
  </template>
247
- </lib-input>
283
+ </lib-simple-input-deprecated>
248
284
  `,
249
285
  }),
250
286
  args: {
@@ -266,6 +302,15 @@ export const WithMultipleValuesWithSuggestions = {
266
302
  },
267
303
  play: playAutosuggestSelectLike
268
304
  }
305
+ export const WithMultipleValuesWithSuggestionsNoSelected = {
306
+ ...MultipleValuesBase,
307
+ args: {
308
+ ...MultipleValuesBase.args,
309
+ suggestions: ["A", "AB", "ABC", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"],
310
+ showSelectedValues: false,
311
+ },
312
+ play: playAutosuggestSelectLike
313
+ }
269
314
  export const WithMultipleValuesDisabled = {
270
315
  ...MultipleValuesBase,
271
316
  args: {
@@ -311,7 +356,7 @@ export const InputSlotReplacement: Story = {
311
356
  Values: <span class="inline-block" data-testid="values">{{values.join(", ")}}</span>\n
312
357
  <br/>
313
358
  Recording: <span class="inline-block" data-testid="recording">{{recording}}</span>\n
314
- <lib-input
359
+ <lib-simple-input-deprecated
315
360
  v-bind="args"
316
361
  v-model="modelValue"
317
362
  v-model:values="values"
@@ -332,7 +377,7 @@ export const InputSlotReplacement: Story = {
332
377
  <template #left>
333
378
  <icon><icon-fa-solid-keyboard/></icon>
334
379
  </template>
335
- </lib-input>
380
+ </lib-simple-input-deprecated>
336
381
  `,
337
382
  }),
338
383
  args: {
@@ -352,13 +397,13 @@ export const NextToButton: Story = {
352
397
 
353
398
  template: `
354
399
  <div class="flex gap-2 items-center">
355
- <lib-input
400
+ <lib-simple-input-deprecated
356
401
  v-bind="args"
357
402
  v-model:values="values"
358
403
  v-model="modelValue"
359
- :label="undefined"
404
+ :label="undefined"
360
405
  >
361
- </lib-input>
406
+ </lib-simple-input-deprecated>
362
407
  <lib-button>Button</lib-button>
363
408
  </div>
364
409
  `,
@@ -1,12 +1,13 @@
1
1
  <template>
2
2
  <div
3
- :class="twMerge(`input wrapper
3
+ :class="twMerge(`input--outer-wrapper
4
4
  grow
5
5
  flex
6
6
  flex-wrap
7
7
  `,
8
8
  disabled && `
9
9
  text-neutral-400
10
+ dark:text-neutral-600
10
11
  `,
11
12
  ($.wrapperAttrs as any)?.class,
12
13
  )"
@@ -20,13 +21,14 @@
20
21
  :disabled="disabled"
21
22
  :readonly="readonly"
22
23
  :valid="valid"
24
+ class="input--label"
23
25
  >
24
26
  <slot v-bind="slotProps">
25
27
  {{ label }}
26
28
  </slot>
27
29
  </lib-label>
28
30
  <!-- Allow blurring when clicking the blank part of a label. -->
29
- <div class="flex-1"/>
31
+ <div class="input--label-spacer flex-1"/>
30
32
  </slot>
31
33
  <!-- These are mostly copies of the classes on LibSimpleInput except made to work with disabled/readonly/etc manually since a div cannot have these states. -->
32
34
  <div
@@ -36,7 +38,7 @@
36
38
  :data-read-only="readonly"
37
39
  :data-is-open="isOpen"
38
40
  v-bind="{...$['inner-wrapperAttrs'], class:undefined}"
39
- :class="twMerge(`inner-wrapper
41
+ :class="twMerge(`input--inner-wrapper
40
42
  relative
41
43
  flex
42
44
  flex-1
@@ -55,7 +57,7 @@
55
57
  isOpen && `rounded-b-none`,
56
58
  !valid && `
57
59
  border-danger-700
58
- outlined:!ring-danger-700
60
+ outlined:!outline-danger-700
59
61
  text-danger-800
60
62
  dark:text-danger-400
61
63
  dark:border-danger-600
@@ -79,7 +81,7 @@
79
81
  <slot name="input" v-bind="{ ...inputProps, ...slotProps, suggestionsIndicatorClickHandler }">
80
82
  <lib-simple-input
81
83
  :class="twMerge(
82
- `p-0`,
84
+ `input--input p-0`,
83
85
  !$slots.left && `-ml-2 pl-2`,
84
86
  !$slots.right && (!$values || $values.length === 0) && !suggestions && `-mr-2 -pr-2`,
85
87
  ($.attrs as any)?.class,
@@ -88,12 +90,11 @@
88
90
  />
89
91
  </slot>
90
92
  <slot name="indicator" v-bind="{isOpen, suggestionsIndicatorClickHandler }">
93
+ <!-- todo, convert to button for accessibility ? -->
91
94
  <div
92
95
  v-if="suggestions"
93
96
  :data-is-open="isOpen"
94
- :class="twMerge(
95
- `indicator flex flex-col justify-center`,
96
- )"
97
+ :class="twMerge(`input--indicator flex flex-col justify-center`)"
97
98
  @click="suggestionsIndicatorClickHandler"
98
99
  >
99
100
  <icon :class="isOpen && `rotate-180`"> <i-fa6-solid-chevron-up/> </icon>
@@ -106,13 +107,12 @@
106
107
  <template v-if="$values && $values.length > 0">
107
108
  <lib-multi-values
108
109
  :class="twMerge(`
110
+ input--multivalues
109
111
  grow-[9000]
110
112
  justify-space-between
111
113
  py-1
112
114
  `,
113
- !$slots.right && `
114
- -mr-1
115
- `,
115
+ !$slots.right && `-mr-1`,
116
116
  ($.multivaluesAttrs as any)?.class,
117
117
  )"
118
118
  v-bind="multivaluesProps"
@@ -125,6 +125,7 @@
125
125
  <!-- todo 1px needs to be abstracted to var -->
126
126
  <lib-suggestions
127
127
  :class="twMerge(`
128
+ input--suggestions
128
129
  absolute
129
130
  -inset-x-px
130
131
  z-10
@@ -151,32 +152,31 @@
151
152
  </template>
152
153
  <script setup lang="ts">
153
154
  import { isBlank } from "@alanscodelog/utils/isBlank.js"
155
+ import { isObject } from "@alanscodelog/utils/isObject.js"
154
156
  import { pushIfNotIn } from "@alanscodelog/utils/pushIfNotIn.js"
155
- import type { MakeRequired } from "@alanscodelog/utils/types"
156
- import { computed,type HTMLAttributes,type InputHTMLAttributes, nextTick, type PropType, ref, toRef, useSlots, watch } from "vue"
157
+ import { computed,type HTMLAttributes,type InputHTMLAttributes, nextTick, onBeforeMount, ref, toRef, useSlots, watch } from "vue"
157
158
  import type { ComponentExposed } from "vue-component-type-helpers"
158
159
 
159
160
  import { useDivideAttrs } from "../../composables/useDivideAttrs.js"
160
161
  import { useSuggestionsInputAria } from "../../composables/useSuggestions.js"
161
- import { hasModifiers } from "../../helpers/hasModifiers.js"
162
162
  import { twMerge } from "../../utils/twMerge.js"
163
163
  import Icon from "../Icon/Icon.vue"
164
164
  import LibLabel from "../LibLabel/LibLabel.vue"
165
165
  import LibMultiValues from "../LibMultiValues/LibMultiValues.vue"
166
166
  import LibSimpleInput from "../LibSimpleInput/LibSimpleInput.vue"
167
167
  import LibSuggestions from "../LibSuggestions/LibSuggestions.vue"
168
- import { type BaseInteractiveProps, baseInteractivePropsDefaults, getFallbackId,type LabelProps, type LinkableByIdProps, type MultiValueProps, type SuggestionsProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
168
+ import { type BaseInteractiveProps, baseInteractivePropsDefaults, getFallbackId, type LabelProps, type LinkableByIdProps, type SuggestionsProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
169
169
 
170
170
 
171
171
  /* #region base */
172
172
  defineOptions({
173
- name: "lib-input",
173
+ name: "lib-simple-input-deprecated",
174
174
  inheritAttrs: false,
175
175
  })
176
176
  const $slots = useSlots()
177
177
  const emit = defineEmits<{
178
- (e: "submit", val: string, suggestion?: any): void
179
178
  (e: "input", val: InputEvent): void
179
+ (e: "submit", val: string, suggestion?: any): void
180
180
  (e: "keydown", val: KeyboardEvent): void
181
181
  (e: "blur", val: FocusEvent): void
182
182
  (e: "focus", val: FocusEvent): void
@@ -185,7 +185,6 @@ const emit = defineEmits<{
185
185
 
186
186
  const fallbackId = getFallbackId()
187
187
 
188
- // eslint-disable-next-line no-use-before-define
189
188
  const props = withDefaults(defineProps<Props>(), {
190
189
  valid: true,
191
190
  suggestions: undefined,
@@ -224,9 +223,17 @@ const suggestionsIndicatorClickHandler = (e: MouseEvent) => {
224
223
 
225
224
  const handleKeydown = (e: KeyboardEvent) => {
226
225
  if (props.suggestions) {
227
- (suggestionsComponent.value as any)?.inputKeydownHandler?.(e)
226
+ if (e.key === "Enter" && activeSuggestion.value === -1 && $values.value) {
227
+ pushIfNotIn($values.value, [$inputValue.value])
228
+ $inputValue.value = ""
229
+ $modelValue.value = ""
230
+ } else {
231
+ (suggestionsComponent.value as any)?.inputKeydownHandler?.(e)
232
+ if ($values.value) {
233
+ $modelValue.value = ""
234
+ }
235
+ }
228
236
  }
229
-
230
237
  emit("keydown", e)
231
238
  }
232
239
  const handleBlur = (e: FocusEvent) => {
@@ -245,9 +252,7 @@ const handleFocus = (e: FocusEvent) => {
245
252
  function addValue(val: string) {
246
253
  if ($values.value === undefined) return
247
254
  if (isBlank(val)) return
248
- props.preventDuplicateValues
249
- ? pushIfNotIn($values.value, [val])
250
- : $values.value.push(val)
255
+ pushIfNotIn($values.value, [val])
251
256
  $inputValue.value = ""
252
257
  $modelValue.value = ""
253
258
  }
@@ -276,7 +281,7 @@ const inputProps = computed(() => ({
276
281
  },
277
282
  onSubmit: (e: string) => {
278
283
  if (!props.suggestions) {
279
- $modelValue.value = e
284
+ $modelValue.value = $values.value ? "" : e
280
285
  emit("submit", e)
281
286
  if ($values.value) {
282
287
  addValue(e)
@@ -289,7 +294,7 @@ const inputProps = computed(() => ({
289
294
  class: undefined,
290
295
  }))
291
296
 
292
- function slotSubmit(val: any): void {
297
+ function slotSubmit(val: any, _wasRemoved: boolean): void {
293
298
  emit("submit", val)
294
299
  }
295
300
  const slotProps = computed(() => ({
@@ -301,6 +306,7 @@ const slotProps = computed(() => ({
301
306
  emitSubmit: slotSubmit
302
307
  }))
303
308
 
309
+
304
310
  const suggestionProps = computed(() => ({
305
311
  id: fullId.value,
306
312
  suggestions: props.suggestions,
@@ -308,16 +314,16 @@ const suggestionProps = computed(() => ({
308
314
  restrictToSuggestions: props.restrictToSuggestions,
309
315
  suggestionLabel: props.suggestionLabel,
310
316
  suggestionsFilter: props.suggestionsFilter,
311
- modelValue: $modelValue.value.toString(),
317
+ modelValue: $values.value ?? $modelValue.value.toString(),
312
318
  inputValue: $inputValue.value,
313
319
  isValid: props.isValid,
314
320
  "onUpdate:inputValue": (e: string) => $inputValue.value = e,
315
- onSubmit: (e: string, suggestion: any) => {
316
- $modelValue.value = e
321
+ onSubmit: (e: string, suggestion?: any, wasRemoved?: boolean) => {
322
+ $modelValue.value = wasRemoved ? "" : e
317
323
  emit("submit", e, suggestion)
318
- if ($values.value) {
319
- addValue(e)
320
- }
324
+ },
325
+ "onUpdate:modelValue": (e: string | string[]) => {
326
+ $values.value &&= e as string[]
321
327
  },
322
328
  "onUpdate:isOpen": (e: boolean) => { isOpen.value = e },
323
329
  "onUpdate:activeSuggestion": (e: number) => activeSuggestion.value = e,
@@ -331,8 +337,8 @@ const multivaluesProps = computed(() => ({
331
337
  border: props.border,
332
338
  disabled: props.disabled,
333
339
  readonly: props.readonly,
334
- values: $values.value,
335
- "onUpdate:values": (e: string[]) => $values.value = e,
340
+ modelValue: $values.value,
341
+ "onUpdate:modelValue": (e: string[]) => $values.value = e,
336
342
  ...$.value.multivaluesAttrs,
337
343
  class: undefined,
338
344
  }))
@@ -342,6 +348,7 @@ defineExpose({
342
348
  suggestionsComponent,
343
349
  el: inputWrapperEl,
344
350
  })
351
+
345
352
  </script>
346
353
  <script lang="ts">
347
354
 
@@ -355,7 +362,6 @@ type RealProps =
355
362
  & LinkableByIdProps
356
363
  & LabelProps
357
364
  & BaseInteractiveProps
358
- & MultiValueProps
359
365
  & {
360
366
  suggestions?: SuggestionsProps["suggestions"]
361
367
  valid?: boolean
@@ -32,7 +32,7 @@ defineOptions({
32
32
 
33
33
  const fallbackId = getFallbackId()
34
34
 
35
-
35
+ // eslint-disable-next-line no-undef
36
36
  withDefaults(defineProps<Props>(), {
37
37
  id: "",
38
38
  unstyled: undefined,
@@ -58,7 +58,7 @@ interface Props
58
58
  /** @vue-ignore */
59
59
  Partial<Omit<LabelHTMLAttributes,"class"> & TailwindClassProp>,
60
60
  RealProps
61
- {}
61
+ { }
62
62
  </script>
63
63
 
64
64
  <script lang="ts">
@@ -12,7 +12,7 @@ const meta = {
12
12
  component: LibMultiValues as any,
13
13
  title: "Components/MultiValues",
14
14
  args: {
15
- values: ["A", "B", "C"],
15
+ modelValue: ["A", "B", "C"],
16
16
  border: true,
17
17
  },
18
18
  tags: ["!test"],
@@ -36,7 +36,7 @@ export const Primary: Story = {
36
36
  const inputValue = ref("B")
37
37
  const multiValueEl = ref<typeof LibMultiValues | null>(null)
38
38
  const onKeydownEnter = (e: KeyboardEvent): void => {
39
- if (e.key === "Enter") (args.values!).push(inputValue.value)
39
+ if (e.key === "Enter") (args.modelValue!).push(inputValue.value)
40
40
  }
41
41
  return ({
42
42
  args,
@@ -49,7 +49,8 @@ export const Primary: Story = {
49
49
 
50
50
  template: `
51
51
  <p>Simple Input connected to multi-value.</p>
52
- <p> Press enter to add value:</p>
52
+ <p>Note: You will be able to add values, including duplicates, even to the disabled/readonly version in this test, see the Input component for a properly connected approach.</p>
53
+ <p> Press enter to add value :</p>
53
54
  <lib-simple-input
54
55
  v-model="inputValue"
55
56
  @keydown="onKeydownEnter"
@@ -60,7 +61,7 @@ export const Primary: Story = {
60
61
  <lib-multi-values
61
62
  ref="multiValueEl"
62
63
  v-bind="args"
63
- v-model:values="args.values"
64
+ v-model="args.modelValue"
64
65
  />
65
66
  </div>
66
67
  `,
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <div
3
- v-if="$values && $values?.length > 0"
3
+ v-if="$modelValue && $modelValue?.length > 0"
4
4
  :class="twMerge(`
5
- values
5
+ multivalues
6
6
  group
7
7
  flex
8
8
  flex-initial
@@ -12,18 +12,18 @@
12
12
  overflow-x-scroll
13
13
  scrollbar-hidden
14
14
  `,
15
- ($ as any)?.class)
15
+ ($.attrs as any)?.class)
16
16
  "
17
17
  :data-disabled="disabled"
18
18
  :data-read-only="readonly"
19
19
  :aria-label="`Values for ${label}`"
20
20
  :tabindex="disabled ? -1 : 0"
21
- v-bind="{...$, class:undefined}"
21
+ v-bind="{...$.attrs, class:undefined}"
22
22
  >
23
23
  <div
24
24
  :data-border="border"
25
25
  :class="twMerge(`
26
- value_wrapper
26
+ multivalues--item
27
27
  flex-basis-0
28
28
  min-w-2
29
29
  flex
@@ -53,13 +53,13 @@
53
53
  ($.itemAttrs as any)?.class
54
54
  )"
55
55
  :tabindex="canEdit ? 0 : undefined"
56
- v-for="(value) of $values"
56
+ v-for="(value) of $modelValue"
57
57
  :key="value"
58
58
  @keydown.ctrl.c.prevent="copy(value.toString())"
59
59
  >
60
- <span class="value_label truncate">{{ value }}</span>
60
+ <span class="multivalues--label truncate">{{ value }}</span>
61
61
  <lib-button
62
- class="!p-0 text-sm !leading-none"
62
+ class="multivalues--remove-button !p-0 text-sm !leading-none"
63
63
  :aria-label="`Remove ${value}`"
64
64
  :border="false"
65
65
  :disabled="disabled || readonly"
@@ -80,7 +80,7 @@ import { copy } from "../../helpers/copy.js"
80
80
  import { twMerge } from "../../utils/twMerge.js"
81
81
  import Icon from "../Icon/Icon.vue"
82
82
  import LibButton from "../LibButton/LibButton.vue"
83
- import { type BaseInteractiveProps, baseInteractivePropsDefaults,type LabelProps, type MultiValueProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
83
+ import { type BaseInteractiveProps, baseInteractivePropsDefaults,type LabelProps, type TailwindClassProp, type WrapperProps } from "../shared/props.js"
84
84
 
85
85
 
86
86
  defineOptions({
@@ -89,18 +89,17 @@ defineOptions({
89
89
  })
90
90
 
91
91
  const $ = useDivideAttrs(["item"] as const)
92
- // eslint-disable-next-line no-use-before-define
93
92
  const props = withDefaults(defineProps<Props>(), {
94
93
  ...baseInteractivePropsDefaults
95
94
  })
96
95
 
97
96
 
98
97
  const canEdit = computed(() => !props.disabled && !props.readonly)
99
- const $values = defineModel<T[]>("values", { default: () => []})
98
+ const $modelValue = defineModel<T[]>({ default: () => []})
100
99
 
101
100
  const removeVal = (value: T) => {
102
101
  if (!canEdit.value) return
103
- removeIfIn($values.value, value)
102
+ removeIfIn($modelValue.value, value)
104
103
  }
105
104
  </script>
106
105
 
@@ -110,7 +109,6 @@ type WrapperTypes = Partial<WrapperProps<"item",HTMLAttributes>>
110
109
  type RealProps =
111
110
  & LabelProps
112
111
  & BaseInteractiveProps
113
- & MultiValueProps
114
112
  & {
115
113
  border?: boolean
116
114
  }
@@ -2,7 +2,7 @@
2
2
  <div :class="twMerge(`notification
3
3
  max-w-700px
4
4
  bg-neutral-50
5
- dark:bg-neutral-950
5
+ dark:bg-neutral-900
6
6
  text-fg
7
7
  dark:text-bg
8
8
  border
@@ -19,7 +19,7 @@
19
19
  ref="notificationEl"
20
20
  @keydown.enter.self="NotificationHandler.resolveToDefault(notification)"
21
21
  >
22
- <div class="header flex-reverse flex justify-between">
22
+ <div class="notification--header flex-reverse flex justify-between">
23
23
  <div v-if="notification.title"
24
24
  tabindex="0"
25
25
  class="title
@@ -30,35 +30,44 @@
30
30
  >
31
31
  {{ notification.title }}
32
32
  </div>
33
- <div class="flex-1"/>
33
+ <div class="notification--spacer flex-1"/>
34
34
  <div class="actions flex">
35
35
  <LibButton :border="false"
36
- class="copy text-neutral-700"
36
+ class="notification--copy-button text-neutral-700"
37
37
  @click="copy(handler ? handler.stringify(notification) : JSON.stringify(notification))"
38
38
  >
39
39
  <icon><i-fa6-regular-copy/></icon>
40
40
  </LibButton>
41
- <lib-button v-if="notification.cancellable" :border="false" @click="NotificationHandler.dismiss(notification)">
41
+ <lib-button
42
+ v-if="notification.cancellable"
43
+ class="notification--cancel-button"
44
+ :border="false"
45
+ @click="NotificationHandler.dismiss(notification)"
46
+ >
42
47
  <icon><i-fa6-solid-xmark/></icon>
43
48
  </lib-button>
44
49
  </div>
45
50
  </div>
46
- <div class="message whitespace-pre-wrap" tabindex="0">
51
+ <div class="notification--message whitespace-pre-wrap" tabindex="0">
47
52
  {{ notification.message }}
48
53
  </div>
49
- <div class="bottom flex items-end justify-between">
54
+ <div class="notification--footer flex items-end justify-between">
50
55
  <div v-if="notification.code" class="code text-xs text-neutral-700 dark:text-neutral-300">
51
56
  Code: {{ notification.code }}
52
57
  </div>
53
- <div class="flex-1 py-1"/>
58
+ <div class="notification--footer-spacer flex-1 py-1"/>
54
59
  <div v-if="notification.options"
55
- class="options
60
+ class="notification--options
56
61
  flex flex-wrap justify-end
57
62
  gap-2
58
63
  "
59
64
  >
60
65
  <lib-button :label="option"
61
- :class="buttonColors[i] == 'secondary' ? 'p-0': undefined"
66
+ :class="twMerge(`
67
+ notification--option-button
68
+ `,
69
+ buttonColors[i] == 'secondary' && 'p-0'
70
+ )"
62
71
  :border="buttonColors[i] !== 'secondary'"
63
72
  :color="buttonColors[i]"
64
73
  v-for="option, i in notification.options"
@@ -86,7 +95,6 @@ defineOptions({
86
95
  })
87
96
  const $attrs = useAttrs()
88
97
 
89
- // eslint-disable-next-line no-use-before-define
90
98
  const props = withDefaults(defineProps<Props>(), {
91
99
  handler: undefined,
92
100
  })
@@ -100,7 +100,7 @@ export const Primary: Story = {
100
100
  backgrounds: { disable: true },
101
101
  // <lib-debug>{{args.handler}}</lib-debug>
102
102
  template: `
103
- <test-wrapper :outline="args.outline">
103
+ <lib-root :outline="args.outline">
104
104
  <lib-button :label="'Notify Timeoutable'" @click="notifyTimeoutable()"></lib-button>
105
105
  <lib-button :label="'Notify RequiresAction'" @click="notifyRequiresAction()"></lib-button>
106
106
  <lib-button :label="'Notify Non-Cancellable that RequiresAction'" @click="notifyNonCancellableRequiresAction()"></lib-button>
@@ -117,7 +117,7 @@ export const Primary: Story = {
117
117
  <br>
118
118
  </template>
119
119
  </lib-debug>
120
- </test-wrapper>
120
+ </lib-root>
121
121
  `,
122
122
  }),
123
123
  }