@flightlesslabs/dodo-ui 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/dist/index.d.ts +32 -9
  2. package/dist/index.js +12 -2
  3. package/dist/stories/Home.mdx +4 -6
  4. package/dist/stories/components/Form/Button/Button.stories.svelte +16 -37
  5. package/dist/stories/components/Form/Button/Button.svelte +45 -47
  6. package/dist/stories/components/Form/Button/Button.svelte.d.ts +16 -12
  7. package/dist/stories/components/Form/Button/Color/Color.stories.svelte +23 -48
  8. package/dist/stories/components/Form/Button/Events/Events.stories.svelte +1 -7
  9. package/dist/stories/components/Form/Button/IconButton/IconButton.stories.svelte +4 -12
  10. package/dist/stories/components/Form/Button/Roundness/Roundness.stories.svelte +5 -31
  11. package/dist/stories/components/Form/Button/Size/Size.stories.svelte +3 -9
  12. package/dist/stories/components/Form/Button/Variant/Variant.stories.svelte +5 -8
  13. package/dist/stories/components/Form/FormControl/FormControl.stories.svelte +11 -12
  14. package/dist/stories/components/Form/FormControl/FormControl.svelte +6 -8
  15. package/dist/stories/components/Form/FormControl/FormControl.svelte.d.ts +1 -1
  16. package/dist/stories/components/Form/Label/Label.stories.svelte +1 -11
  17. package/dist/stories/components/Form/Label/Label.svelte +6 -5
  18. package/dist/stories/components/Form/Label/Label.svelte.d.ts +1 -3
  19. package/dist/stories/components/Form/Message/Color/Color.stories.svelte +9 -9
  20. package/dist/stories/components/Form/Message/Message.stories.svelte +5 -13
  21. package/dist/stories/components/Form/Message/Message.svelte +5 -7
  22. package/dist/stories/components/Form/Message/Message.svelte.d.ts +4 -6
  23. package/dist/stories/components/Form/Message/Size/Size.stories.svelte +3 -5
  24. package/dist/stories/components/Form/PasswordInput/Events/Events.stories.svelte +8 -72
  25. package/dist/stories/components/Form/PasswordInput/PasswordInput.stories.svelte +5 -3
  26. package/dist/stories/components/Form/PasswordInput/PasswordInput.svelte +26 -33
  27. package/dist/stories/components/Form/PasswordInput/PasswordInput.svelte.d.ts +6 -5
  28. package/dist/stories/components/Form/PasswordInput/Roundness/Roundness.stories.svelte +4 -4
  29. package/dist/stories/components/Form/PasswordInput/WithIcon/WithIcon.stories.svelte +2 -2
  30. package/dist/stories/components/Form/Select/Customize/Customize.stories.svelte +120 -0
  31. package/dist/stories/components/Form/Select/Customize/Customize.stories.svelte.d.ts +18 -0
  32. package/dist/stories/components/Form/Select/Events/Events.stories.svelte +138 -0
  33. package/dist/stories/components/Form/Select/Options/OptionFormat.mdx +40 -0
  34. package/dist/stories/components/Form/Select/Roundness/Roundness.stories.svelte +28 -0
  35. package/dist/stories/components/Form/Select/Roundness/Roundness.stories.svelte.d.ts +18 -0
  36. package/dist/stories/components/Form/Select/Select.stories.svelte +114 -0
  37. package/dist/stories/components/Form/Select/Select.stories.svelte.d.ts +22 -0
  38. package/dist/stories/components/Form/Select/Select.svelte +285 -0
  39. package/dist/stories/components/Form/Select/Select.svelte.d.ts +87 -0
  40. package/dist/stories/components/Form/Select/Size/Size.stories.svelte +24 -0
  41. package/dist/stories/components/Form/Select/Size/Size.stories.svelte.d.ts +18 -0
  42. package/dist/stories/components/Form/Select/WithIcon/WithIcon.stories.svelte +39 -0
  43. package/dist/stories/components/Form/Select/WithIcon/WithIcon.stories.svelte.d.ts +18 -0
  44. package/dist/stories/components/Form/TextInput/Events/Events.stories.svelte +7 -63
  45. package/dist/stories/components/Form/TextInput/Roundness/Roundness.stories.svelte +4 -4
  46. package/dist/stories/components/Form/TextInput/TextInput.stories.svelte +6 -4
  47. package/dist/stories/components/Form/TextInput/TextInput.svelte +18 -30
  48. package/dist/stories/components/Form/TextInput/TextInput.svelte.d.ts +10 -5
  49. package/dist/stories/components/Form/TextInput/WithIcon/WithIcon.stories.svelte +4 -4
  50. package/dist/stories/components/Layout/Menu/Menu.stories.svelte +65 -0
  51. package/dist/stories/components/Layout/Menu/Menu.stories.svelte.d.ts +21 -0
  52. package/dist/stories/components/Layout/Menu/Menu.svelte +30 -0
  53. package/dist/stories/components/Layout/Menu/Menu.svelte.d.ts +23 -0
  54. package/dist/stories/components/Layout/Menu/MenuItem/MenuItem.stories.svelte +30 -0
  55. package/dist/stories/components/Layout/Menu/MenuItem/MenuItem.stories.svelte.d.ts +21 -0
  56. package/dist/stories/components/Layout/Menu/MenuItem/MenuItem.svelte +164 -0
  57. package/dist/stories/components/Layout/Menu/MenuItem/MenuItem.svelte.d.ts +49 -0
  58. package/dist/stories/components/Layout/Menu/MenuItem/Size/Size.stories.svelte +16 -0
  59. package/dist/stories/components/Layout/Menu/MenuItem/Type/Type.stories.svelte +21 -0
  60. package/dist/stories/components/{Form/SimpleSelect/WithIcon/WithIcon.stories.svelte.d.ts → Layout/Menu/MenuItem/Type/Type.stories.svelte.d.ts} +3 -3
  61. package/dist/stories/components/Layout/Menu/Size/Size.stories.svelte +37 -0
  62. package/dist/stories/components/{Form/SimpleSelect/Roundness/Roundness.stories.svelte.d.ts → Layout/Menu/Size/Size.stories.svelte.d.ts} +3 -3
  63. package/dist/stories/components/Layout/Paper/Color/Color.stories.svelte +63 -0
  64. package/dist/stories/components/Layout/Paper/Color/Color.stories.svelte.d.ts +26 -0
  65. package/dist/stories/components/Layout/Paper/Paper.stories.svelte +25 -16
  66. package/dist/stories/components/Layout/Paper/Paper.svelte +211 -14
  67. package/dist/stories/components/Layout/Paper/Paper.svelte.d.ts +20 -9
  68. package/dist/stories/components/Layout/Paper/Roundness/Roundness.stories.svelte +8 -13
  69. package/dist/stories/components/Layout/Paper/Shadow/Shadow.stories.svelte +6 -24
  70. package/dist/stories/components/Layout/Paper/utils/scss/mixins.scss +46 -0
  71. package/dist/stories/components/Layout/Separator/Color/Color.stories.svelte +19 -0
  72. package/dist/stories/components/Layout/Separator/Color/Color.stories.svelte.d.ts +26 -0
  73. package/dist/stories/components/Layout/Separator/Separator.stories.svelte +26 -0
  74. package/dist/stories/components/Layout/Separator/Separator.stories.svelte.d.ts +21 -0
  75. package/dist/stories/components/Layout/Separator/Separator.svelte +66 -0
  76. package/dist/stories/components/Layout/Separator/Separator.svelte.d.ts +22 -0
  77. package/dist/stories/components/Layout/Separator/utils/scss/mixins.scss +24 -0
  78. package/dist/stories/developer tools/Intro.mdx +2 -0
  79. package/dist/stories/developer tools/components/DynamicInput/DynamicInput.stories.svelte +49 -0
  80. package/dist/stories/{components/Form/SimpleSelect/SimpleSelect.stories.svelte.d.ts → developer tools/components/DynamicInput/DynamicInput.stories.svelte.d.ts } +5 -7
  81. package/dist/stories/developer tools/components/DynamicInput/DynamicInput.svelte +92 -0
  82. package/dist/stories/developer tools/components/DynamicInput/DynamicInput.svelte.d.ts +60 -0
  83. package/{src/lib/stories/components/Form/TextInput/Size/Size.stories.svelte → dist/stories/developer tools/components/DynamicInput/Size/Size.stories.svelte } +4 -4
  84. package/dist/stories/developer tools/components/DynamicInput/Size/Size.stories.svelte.d.ts +26 -0
  85. package/dist/stories/developer tools/components/InputEnclosure/InputEnclosure.stories.svelte +5 -5
  86. package/dist/stories/developer tools/components/InputEnclosure/InputEnclosure.svelte +19 -15
  87. package/dist/stories/developer tools/components/InputEnclosure/InputEnclosure.svelte.d.ts +4 -3
  88. package/dist/stories/developer tools/components/InputEnclosure/Roundness/Roundness.stories.svelte +4 -4
  89. package/dist/stories/developer tools/components/InputEnclosure/WithIcon/WithIcon.stories.svelte +4 -4
  90. package/dist/stories/developer tools/components/Popper/Popper.stories.svelte +119 -0
  91. package/dist/stories/developer tools/components/Popper/Popper.stories.svelte.d.ts +21 -0
  92. package/dist/stories/developer tools/components/Popper/Popper.svelte +77 -0
  93. package/dist/stories/developer tools/components/Popper/Popper.svelte.d.ts +50 -0
  94. package/dist/stories/developer tools/components/Popper/PopperPopup/PopperPopup.stories.svelte +60 -0
  95. package/dist/stories/developer tools/components/Popper/PopperPopup/PopperPopup.stories.svelte.d.ts +21 -0
  96. package/dist/stories/developer tools/components/Popper/PopperPopup/PopperPopup.svelte +66 -0
  97. package/dist/stories/developer tools/components/Popper/PopperPopup/PopperPopup.svelte.d.ts +34 -0
  98. package/dist/stories/developer tools/components/Popper/PopperPopup/utils/getPopupPosition.d.ts +21 -0
  99. package/dist/stories/developer tools/components/Popper/PopperPopup/utils/getPopupPosition.js +62 -0
  100. package/dist/stories/developer tools/components/Popper/Positions/AutoPosition/AutoPosition.stories.svelte +89 -0
  101. package/dist/stories/developer tools/components/Popper/Positions/AutoPosition/AutoPosition.stories.svelte.d.ts +18 -0
  102. package/dist/stories/developer tools/components/Popper/Positions/Positions.stories.svelte +111 -0
  103. package/dist/stories/developer tools/components/Popper/Positions/Positions.stories.svelte.d.ts +18 -0
  104. package/dist/stories/developer tools/components/UtilityButton/Size/Size.stories.svelte +6 -8
  105. package/dist/stories/developer tools/components/UtilityButton/UtilityButton.stories.svelte +4 -7
  106. package/dist/stories/developer tools/components/UtilityButton/UtilityButton.svelte +8 -5
  107. package/dist/stories/developer tools/components/UtilityButton/UtilityButton.svelte.d.ts +2 -2
  108. package/dist/stories/developer tools/directives/clickOutside/clickOutside.d.ts +3 -0
  109. package/dist/stories/developer tools/directives/clickOutside/clickOutside.js +14 -0
  110. package/dist/stories/developer tools/directives/clickOutside/index.mdx +25 -0
  111. package/dist/stories/{philosophy/Colors/Colors.mdx → developer tools/philosophy/Colors/Colors.mdx } +2 -2
  112. package/dist/stories/{philosophy/Colors/Swatches/Palette.svelte → developer tools/philosophy/Colors/Swatches/Palette.svelte } +1 -1
  113. package/dist/stories/{philosophy/Colors/Swatches/Swatch.svelte → developer tools/philosophy/Colors/Swatches/Swatch.svelte } +1 -1
  114. package/dist/stories/{philosophy/Colors/Swatches/Swatches.svelte → developer tools/philosophy/Colors/Swatches/Swatches.svelte } +1 -1
  115. package/dist/stories/{philosophy/Colors/utils/color.js → developer tools/philosophy/Colors/utils/color.js } +1 -1
  116. package/dist/stories/{philosophy/Themes.mdx → developer tools/philosophy/Themes.mdx } +1 -1
  117. package/dist/styles/_colors.css +44 -44
  118. package/dist/styles/_components.css +6 -3
  119. package/dist/styles/_shadow.css +13 -20
  120. package/dist/styles/_space.css +7 -0
  121. package/dist/styles/_z-index.css +9 -0
  122. package/dist/styles/global.css +2 -0
  123. package/dist/types/colors.d.ts +7 -0
  124. package/dist/types/colors.js +10 -0
  125. package/dist/types/position.d.ts +4 -0
  126. package/dist/types/position.js +2 -0
  127. package/dist/types/roundness.d.ts +3 -0
  128. package/dist/types/roundness.js +1 -0
  129. package/dist/types/shadow.d.ts +3 -0
  130. package/dist/types/shadow.js +1 -0
  131. package/dist/types/size.d.ts +3 -0
  132. package/dist/types/size.js +1 -0
  133. package/dist/types/weight.d.ts +3 -0
  134. package/dist/types/weight.js +1 -0
  135. package/package.json +26 -24
  136. package/src/lib/index.ts +61 -15
  137. package/src/lib/stories/components/Form/Button/Button.svelte +39 -36
  138. package/src/lib/stories/components/Form/FormControl/FormControl.svelte +9 -11
  139. package/src/lib/stories/components/Form/Label/Label.svelte +5 -8
  140. package/src/lib/stories/components/Form/Message/Message.svelte +11 -16
  141. package/src/lib/stories/components/Form/PasswordInput/PasswordInput.svelte +50 -50
  142. package/src/lib/stories/components/Form/Select/Select.svelte +501 -0
  143. package/src/lib/stories/components/Form/TextInput/TextInput.svelte +43 -60
  144. package/src/lib/stories/components/Layout/Menu/Menu.svelte +65 -0
  145. package/src/lib/stories/components/Layout/Menu/MenuItem/MenuItem.svelte +268 -0
  146. package/src/lib/stories/components/Layout/Paper/Paper.svelte +154 -27
  147. package/src/lib/stories/components/Layout/Paper/utils/scss/mixins.scss +46 -0
  148. package/src/lib/stories/components/Layout/Separator/Separator.svelte +96 -0
  149. package/src/lib/stories/components/Layout/Separator/utils/scss/mixins.scss +24 -0
  150. package/src/lib/stories/developer tools/components/DynamicInput/DynamicInput.svelte +195 -0
  151. package/src/lib/stories/developer tools/components/InputEnclosure/InputEnclosure.svelte +22 -18
  152. package/src/lib/stories/developer tools/components/Popper/Popper.svelte +159 -0
  153. package/src/lib/stories/developer tools/components/Popper/PopperPopup/PopperPopup.svelte +120 -0
  154. package/src/lib/stories/developer tools/components/Popper/PopperPopup/utils/getPopupPosition.ts +87 -0
  155. package/src/lib/stories/developer tools/components/UtilityButton/UtilityButton.svelte +8 -6
  156. package/src/lib/stories/developer tools/directives/clickOutside/clickOutside.ts +17 -0
  157. package/src/lib/stories/{philosophy/Colors/Swatches/Palette.svelte → developer tools/philosophy/Colors/Swatches/Palette.svelte } +1 -1
  158. package/src/lib/stories/{philosophy/Colors/Swatches/Swatch.svelte → developer tools/philosophy/Colors/Swatches/Swatch.svelte } +1 -1
  159. package/src/lib/stories/{philosophy/Colors/Swatches/Swatches.svelte → developer tools/philosophy/Colors/Swatches/Swatches.svelte } +1 -1
  160. package/src/lib/stories/{philosophy/Colors/utils/color.ts → developer tools/philosophy/Colors/utils/color.ts } +1 -1
  161. package/src/lib/styles/_colors.css +44 -44
  162. package/src/lib/styles/_components.css +6 -3
  163. package/src/lib/styles/_shadow.css +13 -20
  164. package/src/lib/styles/_space.css +7 -0
  165. package/src/lib/styles/_z-index.css +9 -0
  166. package/src/lib/styles/global.css +2 -0
  167. package/src/lib/types/colors.ts +16 -0
  168. package/src/lib/types/position.ts +5 -0
  169. package/src/lib/types/roundness.ts +3 -0
  170. package/src/lib/types/shadow.ts +3 -0
  171. package/src/lib/types/size.ts +3 -0
  172. package/src/lib/types/weight.ts +3 -0
  173. package/dist/stories/components/Form/SimpleSelect/Events/Events.stories.svelte +0 -74
  174. package/dist/stories/components/Form/SimpleSelect/Roundness/Roundness.stories.svelte +0 -24
  175. package/dist/stories/components/Form/SimpleSelect/SimpleSelect.stories.svelte +0 -59
  176. package/dist/stories/components/Form/SimpleSelect/SimpleSelect.svelte +0 -69
  177. package/dist/stories/components/Form/SimpleSelect/SimpleSelect.svelte.d.ts +0 -50
  178. package/dist/stories/components/Form/SimpleSelect/Size/Size.stories.svelte +0 -20
  179. package/dist/stories/components/Form/SimpleSelect/WithIcon/WithIcon.stories.svelte +0 -36
  180. package/dist/types.d.ts +0 -5
  181. package/dist/types.js +0 -1
  182. package/src/lib/stories/Home.mdx +0 -61
  183. package/src/lib/stories/assets/dark-theme-toggle.png +0 -0
  184. package/src/lib/stories/components/Form/Button/Button.stories.svelte +0 -82
  185. package/src/lib/stories/components/Form/Button/Color/Color.stories.svelte +0 -68
  186. package/src/lib/stories/components/Form/Button/Events/Events.stories.svelte +0 -42
  187. package/src/lib/stories/components/Form/Button/IconButton/IconButton.stories.svelte +0 -51
  188. package/src/lib/stories/components/Form/Button/Roundness/Roundness.stories.svelte +0 -49
  189. package/src/lib/stories/components/Form/Button/Size/Size.stories.svelte +0 -22
  190. package/src/lib/stories/components/Form/Button/Variant/Variant.stories.svelte +0 -21
  191. package/src/lib/stories/components/Form/FormControl/FormControl.stories.svelte +0 -29
  192. package/src/lib/stories/components/Form/Label/Label.stories.svelte +0 -23
  193. package/src/lib/stories/components/Form/Message/Color/Color.stories.svelte +0 -36
  194. package/src/lib/stories/components/Form/Message/Message.stories.svelte +0 -35
  195. package/src/lib/stories/components/Form/Message/Size/Size.stories.svelte +0 -24
  196. package/src/lib/stories/components/Form/PasswordInput/Events/Events.stories.svelte +0 -174
  197. package/src/lib/stories/components/Form/PasswordInput/PasswordInput.stories.svelte +0 -57
  198. package/src/lib/stories/components/Form/PasswordInput/Roundness/Roundness.stories.svelte +0 -20
  199. package/src/lib/stories/components/Form/PasswordInput/Size/Size.stories.svelte +0 -16
  200. package/src/lib/stories/components/Form/PasswordInput/WithIcon/WithIcon.stories.svelte +0 -31
  201. package/src/lib/stories/components/Form/SimpleSelect/Events/Events.stories.svelte +0 -79
  202. package/src/lib/stories/components/Form/SimpleSelect/Roundness/Roundness.stories.svelte +0 -24
  203. package/src/lib/stories/components/Form/SimpleSelect/SimpleSelect.stories.svelte +0 -64
  204. package/src/lib/stories/components/Form/SimpleSelect/SimpleSelect.svelte +0 -159
  205. package/src/lib/stories/components/Form/SimpleSelect/Size/Size.stories.svelte +0 -20
  206. package/src/lib/stories/components/Form/SimpleSelect/WithIcon/WithIcon.stories.svelte +0 -36
  207. package/src/lib/stories/components/Form/TextInput/Events/Events.stories.svelte +0 -153
  208. package/src/lib/stories/components/Form/TextInput/Roundness/Roundness.stories.svelte +0 -21
  209. package/src/lib/stories/components/Form/TextInput/TextInput.stories.svelte +0 -41
  210. package/src/lib/stories/components/Form/TextInput/WithIcon/WithIcon.stories.svelte +0 -47
  211. package/src/lib/stories/components/Layout/Paper/Paper.stories.svelte +0 -41
  212. package/src/lib/stories/components/Layout/Paper/Roundness/Roundness.stories.svelte +0 -30
  213. package/src/lib/stories/components/Layout/Paper/Shadow/Shadow.stories.svelte +0 -42
  214. package/src/lib/stories/developer tools/Intro.mdx +0 -7
  215. package/src/lib/stories/developer tools/components/InputEnclosure/InputEnclosure.stories.svelte +0 -38
  216. package/src/lib/stories/developer tools/components/InputEnclosure/Roundness/Roundness.stories.svelte +0 -20
  217. package/src/lib/stories/developer tools/components/InputEnclosure/Size/Size.stories.svelte +0 -16
  218. package/src/lib/stories/developer tools/components/InputEnclosure/WithIcon/WithIcon.stories.svelte +0 -47
  219. package/src/lib/stories/developer tools/components/UtilityButton/Size/Size.stories.svelte +0 -27
  220. package/src/lib/stories/developer tools/components/UtilityButton/UtilityButton.stories.svelte +0 -33
  221. package/src/lib/stories/philosophy/Colors/Colors.mdx +0 -43
  222. package/src/lib/stories/philosophy/Colors/Colors.stories.svelte +0 -22
  223. package/src/lib/stories/philosophy/Colors/Opacity.stories.svelte +0 -11
  224. package/src/lib/stories/philosophy/Themes.mdx +0 -23
  225. package/src/lib/types.ts +0 -6
  226. /package/dist/stories/components/Form/{SimpleSelect → Select}/Events/Events.stories.svelte.d.ts +0 -0
  227. /package/dist/stories/components/{Form/SimpleSelect → Layout/Menu/MenuItem}/Size/Size.stories.svelte.d.ts +0 -0
  228. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Colors.stories.svelte +0 -0
  229. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Colors.stories.svelte.d.ts +0 -0
  230. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Colors.svelte +0 -0
  231. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Colors.svelte.d.ts +0 -0
  232. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Opacity.stories.svelte +0 -0
  233. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Opacity.stories.svelte.d.ts +0 -0
  234. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Opacity.svelte +0 -0
  235. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Opacity.svelte.d.ts +0 -0
  236. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Swatches/Palette.svelte.d.ts +0 -0
  237. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Swatches/Swatch.svelte.d.ts +0 -0
  238. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/Swatches/Swatches.svelte.d.ts +0 -0
  239. /package/dist/stories/{philosophy → developer tools/philosophy}/Colors/utils/color.d.ts +0 -0
  240. /package/src/lib/stories/{philosophy → developer tools/philosophy}/Colors/Colors.svelte +0 -0
  241. /package/src/lib/stories/{philosophy → developer tools/philosophy}/Colors/Opacity.svelte +0 -0
@@ -1,12 +1,6 @@
1
1
  <script lang="ts" module>
2
- export type PasswordInputToggleEvent = {
3
- event: Event;
4
- toggle: boolean;
5
- };
6
- </script>
7
-
8
- <script lang="ts">
9
- import type { ComponentRoundness, ComponentSize } from '$lib/types.js';
2
+ import type { ComponentSize } from '$lib/types/size.js';
3
+ import type { ComponentRoundness } from '$lib/types/roundness.js';
10
4
  import type { Snippet } from 'svelte';
11
5
  import type {
12
6
  ChangeEventHandler,
@@ -14,12 +8,13 @@
14
8
  FocusEventHandler,
15
9
  FormEventHandler,
16
10
  } from 'svelte/elements';
17
- import type { TextInputFocusEvent } from '../TextInput/TextInput.svelte';
18
- import Icon from '@iconify/svelte';
19
- import UtilityButton from '$lib/stories/developer tools/components/UtilityButton/UtilityButton.svelte';
20
- import InputEnclosure from '$lib/stories/developer tools/components/InputEnclosure/InputEnclosure.svelte';
21
11
 
22
- interface PasswordInputProps {
12
+ export type PasswordInputToggleEvent = {
13
+ event: Event;
14
+ toggle: boolean;
15
+ };
16
+
17
+ export interface PasswordInputProps {
23
18
  /** How large should the button be? */
24
19
  size?: ComponentSize;
25
20
  /** Input ref */
@@ -31,7 +26,7 @@
31
26
  /** Toggle Password Icon */
32
27
  customPasswordToggleIcon?: (toggle: boolean) => Snippet;
33
28
  /** How round should the border radius be? */
34
- roundness?: ComponentRoundness | false;
29
+ roundness?: ComponentRoundness;
35
30
  /** Add a border around the button. Default True */
36
31
  outline?: boolean;
37
32
  /** Input value */
@@ -71,10 +66,18 @@
71
66
  /** ontoggle event handler */
72
67
  ontoggle?: (e: PasswordInputToggleEvent) => void;
73
68
  }
69
+ </script>
70
+
71
+ <script lang="ts">
72
+ import Icon from '@iconify/svelte';
73
+ import UtilityButton from '$lib/stories/developer tools/components/UtilityButton/UtilityButton.svelte';
74
+ import InputEnclosure from '$lib/stories/developer tools/components/InputEnclosure/InputEnclosure.svelte';
75
+ import type { TextInputFocusEvent } from '../TextInput/TextInput.svelte';
76
+ import { DynamicInput, type DynamicInputFocusEvent } from '$lib/index.js';
74
77
 
75
78
  let {
76
79
  size = 'normal',
77
- roundness = '1x',
80
+ roundness = 1,
78
81
  outline = true,
79
82
  name,
80
83
  id,
@@ -106,19 +109,21 @@
106
109
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
110
  let customPasswordToggleIconTyped = customPasswordToggleIcon as any;
108
111
 
109
- function onfocusMod(e: TextInputFocusEvent) {
112
+ function onfocusMod(e: DynamicInputFocusEvent) {
113
+ const eTyped = e as TextInputFocusEvent;
110
114
  focused = true;
111
115
 
112
116
  if (onfocus) {
113
- onfocus(e);
117
+ onfocus(eTyped);
114
118
  }
115
119
  }
116
120
 
117
- function onblurMod(e: TextInputFocusEvent) {
121
+ function onblurMod(e: DynamicInputFocusEvent) {
122
+ const eTyped = e as TextInputFocusEvent;
118
123
  focused = false;
119
124
 
120
125
  if (onblur) {
121
- onblur(e);
126
+ onblur(eTyped);
122
127
  }
123
128
  }
124
129
 
@@ -145,11 +150,12 @@
145
150
  class={['dodo-ui-PasswordInput', `size--${size}`, `roundness--${roundness}`, className].join(' ')}
146
151
  >
147
152
  <InputEnclosure {outline} {disabled} {error} {focused} {size} {roundness} {before} {after}>
148
- <input
153
+ <DynamicInput
149
154
  type={passwordToggle && toggle ? 'text' : 'password'}
150
155
  {name}
151
156
  {id}
152
157
  {disabled}
158
+ bind:ref
153
159
  {oninput}
154
160
  {onchange}
155
161
  onfocus={onfocusMod}
@@ -159,56 +165,50 @@
159
165
  {oncut}
160
166
  {placeholder}
161
167
  bind:value
162
- bind:this={ref}
163
168
  {readonly}
169
+ variant="input"
164
170
  />
165
171
 
166
172
  {#if passwordToggle && !disabled}
167
- <UtilityButton {size} title="Toggle password" class="passwordToggle" onclick={ontoggleMod}>
168
- {#if customPasswordToggleIcon}
169
- {@render customPasswordToggleIconTyped(toggle)}
170
- {:else if toggle}
171
- <Icon icon="mdi:eye-off" width="24" height="24" />
172
- {:else}
173
- <Icon icon="mdi:eye" width="24" height="24" />
174
- {/if}
175
- </UtilityButton>
173
+ <div class:after class="passwordToggle">
174
+ <UtilityButton {size} title="Toggle password" onclick={ontoggleMod}>
175
+ {#if customPasswordToggleIcon}
176
+ {@render customPasswordToggleIconTyped(toggle)}
177
+ {:else if toggle}
178
+ <Icon icon="mdi:eye-off" width="24" height="24" />
179
+ {:else}
180
+ <Icon icon="mdi:eye" width="24" height="24" />
181
+ {/if}
182
+ </UtilityButton>
183
+ </div>
176
184
  {/if}
177
185
  </InputEnclosure>
178
186
  </div>
179
187
 
180
188
  <style lang="scss">
181
189
  .dodo-ui-PasswordInput {
182
- input {
183
- flex: 1;
184
- border: 0;
185
- outline: 0;
186
- height: 100%;
187
- background-color: transparent;
188
- font-family: inherit;
189
- color: inherit;
190
- letter-spacing: 0.3px;
191
- }
192
-
193
190
  &.size {
194
191
  &--normal {
195
- input {
196
- font-size: 1rem;
197
- padding: 0 12px;
192
+ .passwordToggle {
193
+ &.after {
194
+ margin-right: calc(var(--dodo-ui-space-small) * 2);
195
+ }
198
196
  }
199
197
  }
200
198
 
201
199
  &--small {
202
- input {
203
- padding: 0 8px;
204
- font-size: 0.9rem;
200
+ .passwordToggle {
201
+ &.after {
202
+ margin-right: var(--dodo-ui-space);
203
+ }
205
204
  }
206
205
  }
207
206
 
208
207
  &--large {
209
- input {
210
- font-size: 1.1rem;
211
- padding: 0 14px;
208
+ .passwordToggle {
209
+ &.after {
210
+ margin-right: calc(var(--dodo-ui-space) * 2);
211
+ }
212
212
  }
213
213
  }
214
214
  }
@@ -0,0 +1,501 @@
1
+ <script lang="ts" module>
2
+ import type { ComponentSize } from '$lib/types/size.js';
3
+ import type { ComponentRoundness } from '$lib/types/roundness.js';
4
+ import type { Snippet } from 'svelte';
5
+ import type {
6
+ ChangeEventHandler,
7
+ ClipboardEventHandler,
8
+ FocusEventHandler,
9
+ FormEventHandler,
10
+ MouseEventHandler,
11
+ } from 'svelte/elements';
12
+
13
+ export type SelectOption = {
14
+ value: string | number | boolean | null | undefined;
15
+ label: string;
16
+ disabled?: boolean;
17
+ };
18
+
19
+ export interface SelectProps {
20
+ /** How large should the button be? */
21
+ size?: ComponentSize;
22
+ /** want a searchable Select? */
23
+ options: SelectOption[];
24
+ /** want a searchable Select? */
25
+ searchable?: boolean;
26
+ /** want a clearable Select? */
27
+ clearable?: boolean;
28
+ /** onselect event handler */
29
+ onselect?: (val: SelectOption) => void;
30
+ /** onclear event handler */
31
+ onclear?: MouseEventHandler<HTMLButtonElement>;
32
+ /** Select ref */
33
+ ref?: HTMLInputElement | HTMLButtonElement;
34
+ /** How round should the border radius be? */
35
+ roundness?: ComponentRoundness;
36
+ /** Add a border around the button. Default True */
37
+ outline?: boolean;
38
+ /** Select value */
39
+ value: SelectOption | undefined;
40
+ /** How round should the border radius be? */
41
+ placeholder?: string;
42
+ /** Placeholder if there are no options found*/
43
+ optionsPlaceholder?: string;
44
+ /** disabled state */
45
+ disabled?: boolean;
46
+ /** Read only ? */
47
+ readonly?: boolean;
48
+ /** is there any associated Error ? */
49
+ error?: boolean;
50
+ /** Name */
51
+ name?: string;
52
+ /** Id */
53
+ id?: string;
54
+ /** Icon before button content */
55
+ before?: Snippet;
56
+ /** Icon after button content */
57
+ after?: Snippet;
58
+ /** Custom css class*/
59
+ class?: string;
60
+ /** onchange event handler */
61
+ onchange?: ChangeEventHandler<HTMLInputElement>;
62
+ /** oninput event handler */
63
+ oninput?: FormEventHandler<HTMLInputElement>;
64
+ /** onblur event handler */
65
+ onblur?: FocusEventHandler<HTMLInputElement | HTMLButtonElement>;
66
+ /** onfocus event handler */
67
+ onfocus?: FocusEventHandler<HTMLInputElement | HTMLButtonElement>;
68
+ /** onpaste event handler */
69
+ onpaste?: ClipboardEventHandler<HTMLInputElement>;
70
+ /** oncopy event handler */
71
+ oncopy?: ClipboardEventHandler<HTMLInputElement>;
72
+ /** oncut event handler */
73
+ oncut?: ClipboardEventHandler<HTMLInputElement>;
74
+ /** custom Content Formatting for variant button */
75
+ customInputContent?: (val: SelectOption) => Snippet;
76
+ /** custom Content Formatting for variant button */
77
+ customMenuItemContent?: (val: SelectOption, selected: boolean) => Snippet;
78
+ /** Custom Popup Content */
79
+ customPopupContent?: (options: SelectOption[], selectedOption: SelectOption) => Snippet;
80
+ /** custom Content Formatting for variant button */
81
+ customPlaceholderMenuItemContent?: () => Snippet;
82
+ /** PopperPopup Max height. Use css compatible value */
83
+ popupMaxHeight?: string;
84
+ /** PaperProps: Paper component props for Popup */
85
+ paperProps?: Partial<PaperProps>;
86
+ /** PopperProps: Popper component props */
87
+ popperProps?: Partial<PopperProps>;
88
+ /** MenuProps: Menu component props */
89
+ menuProps?: Partial<MenuProps>;
90
+ /** MenuItem: Menu component props */
91
+ menuItemProps?: Partial<MenuItemProps>;
92
+ }
93
+ </script>
94
+
95
+ <script lang="ts">
96
+ import InputEnclosure from '$lib/stories/developer tools/components/InputEnclosure/InputEnclosure.svelte';
97
+ import UtilityButton from '$lib/stories/developer tools/components/UtilityButton/UtilityButton.svelte';
98
+ import Icon from '@iconify/svelte';
99
+ import {
100
+ DynamicInput,
101
+ Menu,
102
+ MenuItem,
103
+ Popper,
104
+ type DynamicInputFocusEvent,
105
+ type MenuItemProps,
106
+ type MenuProps,
107
+ type PaperProps,
108
+ type PopperProps,
109
+ } from '$lib/index.js';
110
+ import type { TextInputInputEvent } from '../TextInput/TextInput.svelte';
111
+ import type { ButtonClickEvent } from '../Button/Button.svelte';
112
+
113
+ let {
114
+ size = 'normal',
115
+ roundness = 1,
116
+ outline = true,
117
+ name,
118
+ id,
119
+ class: className = '',
120
+ disabled = false,
121
+ onchange,
122
+ oninput,
123
+ onselect,
124
+ onblur,
125
+ onfocus,
126
+ onpaste,
127
+ oncopy,
128
+ oncut,
129
+ before,
130
+ after,
131
+ error = false,
132
+ value,
133
+ placeholder,
134
+ ref = $bindable<HTMLInputElement | HTMLButtonElement>(),
135
+ readonly = false,
136
+ searchable = false,
137
+ clearable = false,
138
+ onclear,
139
+ options: optionsRaw,
140
+ customInputContent: customInputContentInternal,
141
+ customMenuItemContent: customMenuItemContentInternal,
142
+ customPopupContent: customPopupContentInternal,
143
+ customPlaceholderMenuItemContent: customPlaceholderMenuItemContentInternal,
144
+ popupMaxHeight = '300px',
145
+ paperProps,
146
+ popperProps,
147
+ menuProps,
148
+ menuItemProps,
149
+ optionsPlaceholder = 'No Options',
150
+ }: SelectProps = $props();
151
+
152
+ let open: boolean = $state(false);
153
+ let onInputStart: boolean = $state(false);
154
+ const selectedOption = $derived(value);
155
+ let searchTerm = $state(value?.label.trim() || '');
156
+ let options = $state(optionsRaw);
157
+ let menuRef = $state<HTMLUListElement | undefined>(undefined);
158
+ let menuItemIndex = $state(0);
159
+
160
+ $effect(() => {
161
+ if (!onInputStart) {
162
+ options = optionsRaw;
163
+ return;
164
+ }
165
+
166
+ const searchTermSimplified = searchTerm.trim().toLowerCase();
167
+
168
+ if (!searchTermSimplified) {
169
+ options = optionsRaw;
170
+ return;
171
+ }
172
+
173
+ options = optionsRaw.filter((item) =>
174
+ item.label.trim().toLowerCase().includes(searchTermSimplified),
175
+ );
176
+ });
177
+
178
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
179
+ let customInputContentTyped = customInputContentInternal as any;
180
+
181
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
182
+ let customMenuItemContentTyped = customMenuItemContentInternal as any;
183
+
184
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
185
+ let customPopupContentTyped = customPopupContentInternal as any;
186
+
187
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
188
+ let customPlaceholderMenuItemContentTyped = customPlaceholderMenuItemContentInternal as any;
189
+
190
+ function closeMenu() {
191
+ open = false;
192
+ menuItemIndex = 0;
193
+
194
+ ref?.blur();
195
+ }
196
+
197
+ function openMenu() {
198
+ open = true;
199
+
200
+ const menuItemIndexNew = options.findIndex((item) => item.value === selectedOption?.value);
201
+
202
+ if (menuItemIndexNew < 0) {
203
+ menuItemIndex = 0;
204
+ } else {
205
+ menuItemIndex = menuItemIndexNew;
206
+ }
207
+ }
208
+
209
+ function onfocusMod(e: DynamicInputFocusEvent) {
210
+ openMenu();
211
+
212
+ if (onfocus) {
213
+ onfocus(e);
214
+ }
215
+ }
216
+
217
+ function onblurMod(e: DynamicInputFocusEvent) {
218
+ if (onblur) {
219
+ onblur(e);
220
+ }
221
+ }
222
+
223
+ function onClickOutside() {
224
+ searchTerm = selectedOption?.label || '';
225
+ onInputStart = false;
226
+
227
+ closeMenu();
228
+ }
229
+
230
+ function onselectMod(val: SelectOption) {
231
+ searchTerm = val.label;
232
+ onInputStart = false;
233
+
234
+ closeMenu();
235
+
236
+ if (onselect) {
237
+ onselect(val);
238
+ }
239
+ }
240
+
241
+ function oninputMod(e: TextInputInputEvent) {
242
+ const target = e.target as HTMLInputElement;
243
+ searchTerm = target.value;
244
+ onInputStart = true;
245
+
246
+ if (oninput) {
247
+ oninput(e);
248
+ }
249
+ }
250
+
251
+ function onclearMod(e: ButtonClickEvent) {
252
+ searchTerm = '';
253
+ onInputStart = false;
254
+
255
+ closeMenu();
256
+
257
+ if (onclear) {
258
+ onclear(e);
259
+ }
260
+ }
261
+
262
+ function onKeyBoardEnter(selectedItemIndex: number) {
263
+ const targetOption = options[selectedItemIndex];
264
+
265
+ if (!targetOption) {
266
+ return;
267
+ }
268
+
269
+ if (targetOption.disabled) {
270
+ return;
271
+ }
272
+
273
+ onselectMod(targetOption);
274
+ }
275
+
276
+ function onKeyboardNavigation(e: KeyboardEvent) {
277
+ let keyHit: string | undefined = undefined;
278
+
279
+ if (!menuRef) {
280
+ return;
281
+ }
282
+
283
+ if (!open) {
284
+ return;
285
+ }
286
+
287
+ switch (e.key) {
288
+ case 'ArrowDown':
289
+ case 'ArrowUp':
290
+ case 'Enter':
291
+ keyHit = e.key;
292
+ e.preventDefault();
293
+ break;
294
+ default:
295
+ break;
296
+ }
297
+
298
+ if (!keyHit) {
299
+ return;
300
+ }
301
+
302
+ const listItems = menuRef.querySelectorAll(':scope > li.dodo-ui-MenuItem');
303
+
304
+ if (!listItems.length) {
305
+ return;
306
+ }
307
+
308
+ for (let index = 0; index < listItems.length; index++) {
309
+ const element = listItems[index];
310
+
311
+ element.classList.remove('hover');
312
+ }
313
+
314
+ let newMenuItemIndex = menuItemIndex;
315
+
316
+ if (keyHit === 'ArrowDown') {
317
+ if (listItems[newMenuItemIndex + 1]) {
318
+ newMenuItemIndex = newMenuItemIndex + 1;
319
+ } else {
320
+ newMenuItemIndex = 0;
321
+ }
322
+ } else if (keyHit === 'ArrowUp') {
323
+ if (listItems[newMenuItemIndex - 1]) {
324
+ newMenuItemIndex = newMenuItemIndex - 1;
325
+ } else {
326
+ newMenuItemIndex = listItems.length - 1;
327
+ }
328
+ } else if (keyHit === 'Enter') {
329
+ onKeyBoardEnter(newMenuItemIndex);
330
+ return;
331
+ }
332
+
333
+ const targetItem = listItems[newMenuItemIndex] as HTMLLIElement;
334
+
335
+ targetItem.classList.add('hover');
336
+
337
+ targetItem.focus();
338
+ targetItem.scrollIntoView({ block: 'nearest' });
339
+
340
+ menuItemIndex = newMenuItemIndex;
341
+ }
342
+
343
+ $effect(() => {
344
+ if (!menuRef) {
345
+ return;
346
+ }
347
+
348
+ if (!open) {
349
+ return;
350
+ }
351
+
352
+ const targetItem = menuRef.querySelector(':scope > li.dodo-ui-MenuItem.selected') as
353
+ | HTMLLIElement
354
+ | undefined;
355
+
356
+ if (targetItem) {
357
+ targetItem.classList.add('hover');
358
+
359
+ targetItem.focus();
360
+ targetItem.scrollIntoView({ block: 'nearest' });
361
+ }
362
+
363
+ window.addEventListener('keydown', onKeyboardNavigation);
364
+
365
+ return () => {
366
+ window.removeEventListener('keydown', onKeyboardNavigation);
367
+ };
368
+ });
369
+ </script>
370
+
371
+ <div class={['dodo-ui-Select', className].join(' ')}>
372
+ <Popper fullWidth {open} {onClickOutside} {...popperProps} {popupMaxHeight} {paperProps}>
373
+ <div
374
+ class:outline
375
+ class:disabled
376
+ class:error
377
+ class={[
378
+ 'Select',
379
+ `size--${size}`,
380
+ `${open ? 'focused' : ''}`,
381
+ `roundness--${roundness}`,
382
+ className,
383
+ ].join(' ')}
384
+ >
385
+ <InputEnclosure
386
+ {outline}
387
+ {disabled}
388
+ {error}
389
+ focused={open}
390
+ {size}
391
+ {roundness}
392
+ {before}
393
+ {after}
394
+ >
395
+ <DynamicInput
396
+ type="text"
397
+ {name}
398
+ {id}
399
+ {disabled}
400
+ bind:ref
401
+ oninput={oninputMod}
402
+ {onchange}
403
+ onfocus={onfocusMod}
404
+ onblur={onblurMod}
405
+ {onpaste}
406
+ {oncopy}
407
+ {oncut}
408
+ {placeholder}
409
+ value={searchable ? searchTerm : selectedOption?.label}
410
+ {readonly}
411
+ variant={searchable ? 'input' : 'button'}
412
+ >
413
+ {#snippet customInputContent()}
414
+ {#if customInputContentTyped}
415
+ {@render customInputContentTyped(selectedOption)}
416
+ {:else}
417
+ {selectedOption?.label || placeholder}
418
+ {/if}
419
+ {/snippet}
420
+ </DynamicInput>
421
+
422
+ {#if selectedOption?.label && clearable && !disabled}
423
+ <div class:after class="SelectClear">
424
+ <UtilityButton {size} title="Clear" onclick={onclearMod}>
425
+ <Icon icon="material-symbols:close-small" width="24" height="24" />
426
+ </UtilityButton>
427
+ </div>
428
+ {/if}
429
+ </InputEnclosure>
430
+ </div>
431
+
432
+ {#snippet popupChildren()}
433
+ {#if customPopupContentTyped}
434
+ {@render customPopupContentTyped(options, selectedOption)}
435
+ {:else}
436
+ <Menu bind:ref={menuRef} {...menuProps}>
437
+ {#if options.length}
438
+ {#each options as option (option.value)}
439
+ <MenuItem
440
+ onclick={() => onselectMod(option)}
441
+ type="button"
442
+ disabled={option.disabled}
443
+ selected={selectedOption?.value === option.value}
444
+ {...menuItemProps}
445
+ >
446
+ {#if customMenuItemContentTyped}
447
+ {@render customMenuItemContentTyped(
448
+ option,
449
+ selectedOption?.value === option.value,
450
+ )}
451
+ {:else}
452
+ {option.label}
453
+ {/if}
454
+ </MenuItem>
455
+ {/each}
456
+ {:else}
457
+ <MenuItem type="text" disabled={true} {...menuItemProps}>
458
+ {#if customPlaceholderMenuItemContentTyped}
459
+ {@render customPlaceholderMenuItemContentTyped()}
460
+ {:else}
461
+ {optionsPlaceholder}
462
+ {/if}
463
+ </MenuItem>
464
+ {/if}
465
+ </Menu>
466
+ {/if}
467
+ {/snippet}
468
+ </Popper>
469
+ </div>
470
+
471
+ <style lang="scss">
472
+ .dodo-ui-Select {
473
+ .Select {
474
+ &.size {
475
+ &--normal {
476
+ .SelectClear {
477
+ &.after {
478
+ margin-right: calc(var(--dodo-ui-space-small) * 2);
479
+ }
480
+ }
481
+ }
482
+
483
+ &--small {
484
+ .SelectClear {
485
+ &.after {
486
+ margin-right: var(--dodo-ui-space);
487
+ }
488
+ }
489
+ }
490
+
491
+ &--large {
492
+ .SelectClear {
493
+ &.after {
494
+ margin-right: calc(var(--dodo-ui-space) * 2);
495
+ }
496
+ }
497
+ }
498
+ }
499
+ }
500
+ }
501
+ </style>