webcoreui 0.3.0 → 0.4.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 (127) hide show
  1. package/README.md +5 -2
  2. package/astro.d.ts +7 -1
  3. package/astro.js +6 -0
  4. package/components/Accordion/Accordion.astro +2 -0
  5. package/components/Accordion/Accordion.svelte +2 -0
  6. package/components/Accordion/Accordion.tsx +2 -0
  7. package/components/Alert/Alert.astro +3 -2
  8. package/components/Alert/Alert.svelte +4 -3
  9. package/components/Alert/Alert.tsx +3 -2
  10. package/components/Avatar/Avatar.astro +2 -1
  11. package/components/Avatar/Avatar.svelte +2 -1
  12. package/components/Avatar/Avatar.tsx +3 -3
  13. package/components/Badge/Badge.astro +1 -0
  14. package/components/Badge/Badge.svelte +3 -2
  15. package/components/Badge/Badge.tsx +2 -1
  16. package/components/Button/Button.astro +4 -5
  17. package/components/Button/Button.svelte +2 -1
  18. package/components/Button/Button.tsx +2 -1
  19. package/components/Button/button.ts +1 -1
  20. package/components/Card/Card.astro +11 -3
  21. package/components/Card/Card.svelte +5 -2
  22. package/components/Card/Card.tsx +5 -2
  23. package/components/Card/card.ts +1 -0
  24. package/components/Checkbox/Checkbox.astro +1 -0
  25. package/components/Checkbox/Checkbox.svelte +7 -5
  26. package/components/Checkbox/Checkbox.tsx +4 -2
  27. package/components/Collapsible/Collapsible.astro +2 -1
  28. package/components/Collapsible/Collapsible.svelte +2 -1
  29. package/components/Collapsible/Collapsible.tsx +55 -54
  30. package/components/ConditionalWrapper/ConditionalWrapper.astro +2 -1
  31. package/components/ConditionalWrapper/ConditionalWrapper.tsx +1 -2
  32. package/components/Group/Group.astro +22 -0
  33. package/components/Group/Group.svelte +20 -0
  34. package/components/Group/Group.tsx +22 -0
  35. package/components/Group/group.module.scss +43 -0
  36. package/components/Group/group.ts +8 -0
  37. package/components/Icon/map.ts +2 -0
  38. package/components/Input/Input.astro +8 -1
  39. package/components/Input/Input.svelte +15 -3
  40. package/components/Input/Input.tsx +10 -3
  41. package/components/Input/input.module.scss +4 -1
  42. package/components/Input/input.ts +9 -4
  43. package/components/List/List.astro +169 -0
  44. package/components/List/List.svelte +147 -0
  45. package/components/List/List.tsx +168 -0
  46. package/components/List/list.module.scss +91 -0
  47. package/components/List/list.ts +37 -0
  48. package/components/Menu/Menu.astro +2 -1
  49. package/components/Menu/Menu.svelte +7 -5
  50. package/components/Menu/Menu.tsx +116 -113
  51. package/components/Modal/Modal.astro +6 -4
  52. package/components/Modal/Modal.svelte +8 -6
  53. package/components/Modal/Modal.tsx +79 -76
  54. package/components/Modal/modal.ts +1 -0
  55. package/components/Popover/Popover.astro +4 -1
  56. package/components/Popover/Popover.svelte +4 -2
  57. package/components/Popover/Popover.tsx +55 -27
  58. package/components/Popover/popover.module.scss +1 -0
  59. package/components/Popover/popover.ts +2 -0
  60. package/components/Progress/Progress.astro +2 -1
  61. package/components/Progress/Progress.svelte +2 -1
  62. package/components/Progress/Progress.tsx +3 -2
  63. package/components/Radio/Radio.astro +1 -0
  64. package/components/Radio/Radio.svelte +4 -2
  65. package/components/Radio/Radio.tsx +3 -2
  66. package/components/Rating/Rating.astro +3 -1
  67. package/components/Rating/Rating.svelte +9 -7
  68. package/components/Rating/Rating.tsx +4 -2
  69. package/components/Select/Select.astro +135 -0
  70. package/components/Select/Select.svelte +122 -0
  71. package/components/Select/Select.tsx +142 -0
  72. package/components/Select/select.module.scss +25 -0
  73. package/components/Select/select.ts +21 -0
  74. package/components/Sheet/Sheet.astro +2 -1
  75. package/components/Sheet/Sheet.svelte +2 -1
  76. package/components/Sheet/Sheet.tsx +33 -32
  77. package/components/Slider/Slider.astro +2 -1
  78. package/components/Slider/Slider.svelte +2 -1
  79. package/components/Slider/Slider.tsx +49 -48
  80. package/components/Spinner/Spinner.astro +4 -3
  81. package/components/Spinner/Spinner.svelte +3 -2
  82. package/components/Spinner/Spinner.tsx +4 -3
  83. package/components/Switch/Switch.astro +2 -1
  84. package/components/Switch/Switch.svelte +5 -4
  85. package/components/Switch/Switch.tsx +2 -2
  86. package/components/Switch/switch.module.scss +1 -1
  87. package/components/Table/Table.astro +1 -0
  88. package/components/Table/Table.svelte +2 -1
  89. package/components/Table/Table.tsx +2 -1
  90. package/components/Tabs/Tabs.astro +2 -1
  91. package/components/Tabs/Tabs.svelte +2 -1
  92. package/components/Tabs/Tabs.tsx +4 -3
  93. package/components/Textarea/Textarea.astro +1 -0
  94. package/components/Textarea/Textarea.svelte +3 -1
  95. package/components/Textarea/Textarea.tsx +52 -50
  96. package/components/ThemeSwitcher/ThemeSwitcher.astro +108 -107
  97. package/components/ThemeSwitcher/ThemeSwitcher.svelte +5 -4
  98. package/components/ThemeSwitcher/ThemeSwitcher.tsx +91 -90
  99. package/components/Timeline/Timeline.astro +3 -2
  100. package/components/Timeline/Timeline.svelte +3 -2
  101. package/components/Timeline/Timeline.tsx +3 -2
  102. package/components/TimelineItem/TimelineItem.svelte +2 -1
  103. package/components/TimelineItem/TimelineItem.tsx +2 -1
  104. package/components/Toast/Toast.astro +3 -1
  105. package/components/Toast/Toast.svelte +3 -1
  106. package/components/Toast/Toast.tsx +3 -1
  107. package/icons/moon.svg +1 -1
  108. package/icons/search.svg +3 -0
  109. package/icons.d.ts +1 -0
  110. package/icons.js +1 -0
  111. package/index.d.ts +55 -25
  112. package/package.json +22 -4
  113. package/react.d.ts +6 -0
  114. package/react.js +6 -0
  115. package/scss/config/mixins.scss +12 -10
  116. package/scss/config/variables.scss +1 -0
  117. package/scss/config.scss +1 -0
  118. package/scss/global/utility.scss +2 -0
  119. package/svelte.d.ts +7 -1
  120. package/svelte.js +6 -0
  121. package/utils/cookies.ts +4 -4
  122. package/utils/debounce.ts +1 -1
  123. package/utils/event.ts +2 -2
  124. package/utils/interpolate.ts +5 -5
  125. package/utils/modal.ts +90 -27
  126. package/utils/popover.ts +30 -8
  127. package/utils/toast.ts +6 -2
package/index.d.ts CHANGED
@@ -1,3 +1,16 @@
1
+
2
+ type ModalCallback = {
3
+ trigger: Element | null
4
+ modal: HTMLElement
5
+ }
6
+
7
+ type Modal = {
8
+ trigger: string
9
+ modal: string
10
+ onOpen?: (args: ModalCallback) => unknown
11
+ onClose?: (args: ModalCallback) => unknown
12
+ }
13
+
1
14
  type PopoverPosition = 'top'
2
15
  | 'top-start'
3
16
  | 'top-end'
@@ -11,12 +24,20 @@ type PopoverPosition = 'top'
11
24
  | 'bottom-start'
12
25
  | 'bottom-end'
13
26
 
27
+ type PopoverCallback = {
28
+ trigger: HTMLElement
29
+ popover: HTMLElement
30
+ position: PopoverPosition | undefined
31
+ }
32
+
14
33
  type Popover = {
15
34
  trigger: string
16
35
  popover: string
17
36
  position?: PopoverPosition
18
37
  offset?: number
19
38
  closeOnBlur?: boolean
39
+ onOpen?: (args: PopoverCallback) => unknown
40
+ onClose?: (args: PopoverCallback) => unknown
20
41
  }
21
42
 
22
43
  type Toast = {
@@ -24,46 +45,55 @@ type Toast = {
24
45
  timeout?: number
25
46
  title?: string
26
47
  content?: string
27
- theme?: 'info' | 'success' | 'warning' | 'alert' | null
28
48
  position?: 'bottom-left'
29
49
  | 'top-left'
30
50
  | 'top-right'
31
51
  | 'bottom-full'
32
52
  | 'top-full'
53
+ | null
33
54
  }
34
55
 
35
56
  declare module 'webcoreui' {
36
- export const classNames = (classes: any[]) => string
37
-
38
- export const setCookie = (name: string, value: string, days: number) => {}
39
- export const getCookie = (name: string) => string | null
40
- export const removeCookie = (name: string) => {}
57
+ export const classNames: (classes: any[]) => string
58
+
59
+ export const setCookie: (name: string, value: string, days: number) => void
60
+ export const getCookie: (name: string) => string | null
61
+ export const removeCookie: (name: string) => void
41
62
 
42
- export const debounce = (fn: any, waitFor: number) => any
63
+ export const debounce: <T extends (...args: any[]) => any>(
64
+ fn: T,
65
+ waitFor?: number
66
+ ) => {
67
+ (...args: Parameters<T>): void
68
+ cancel: () => void
69
+ }
43
70
 
44
- export const dispatch = (event: string, detail: any) => {}
45
- export const listen = (event: string, callback: (e: any) => any) => {
46
- remove()
71
+ export const dispatch: (event: string, detail: unknown) => void
72
+ export const listen: (event: string, callback: (e: any) => unknown) => {
73
+ remove: () => void
47
74
  }
48
75
 
49
- export const clamp = (num: number, min: number, max: number) => number
50
- export const lerp = (start: number, end: number, value: number) => number
51
- export const invlerp = (start: number, end: number, value: number) => number
52
- export const interpolate = (
76
+ export const clamp: (num: number, min: number, max: number) => number
77
+ export const lerp: (start: number, end: number, value: number) => number
78
+ export const invlerp: (start: number, end: number, value: number) => number
79
+ export const interpolate: (
53
80
  value: number,
54
81
  input: [start: number, end: number],
55
- output: [start: number, end: number],
82
+ output: [start: number, end: number]
56
83
  ) => number
57
84
 
58
- export const modal = (selector: string) => {}
59
- export const closeModal = (selector: string) => {}
85
+ export const modal: (config: Modal | string) => {
86
+ open: () => void
87
+ remove: () => void
88
+ } | void
89
+ export const closeModal: (modal: string) => void
60
90
 
61
- export const popover = (config: Popover) => {
62
- remove()
63
- }
64
- export const closePopover = (selector: string) => {}
91
+ export const popover: (config: Popover) => {
92
+ remove: () => void
93
+ } | void
94
+ export const closePopover: (selector: string) => void
65
95
 
66
- export const setDefaultTimeout = (time: number) => number
67
- export const toast = (config: Toast | string) => {}
68
- export const hideToast = (element: string) => {}
69
- }
96
+ export const setDefaultTimeout: (time: number) => number
97
+ export const toast: (config: Toast | string) => void
98
+ export const hideToast: (element: string) => void
99
+ }
package/package.json CHANGED
@@ -1,24 +1,39 @@
1
1
  {
2
2
  "name": "webcoreui",
3
3
  "type": "module",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "scripts": {
6
+ "prepare": "husky",
7
+ "pre-commit": "lint-staged",
6
8
  "dev": "astro dev",
7
9
  "build": "astro check && astro build",
8
10
  "build:package": "node scripts/build.js",
9
11
  "test": "echo \"Error: no test specified\"",
10
- "create-component": "node scripts/createComponent.js"
12
+ "create-component": "node scripts/createComponent.js",
13
+ "lint": "eslint src/**/* --fix"
11
14
  },
12
- "dependencies": {
15
+ "devDependencies": {
13
16
  "@astrojs/check": "0.7.0",
14
17
  "@astrojs/react": "3.5.0",
15
18
  "@astrojs/svelte": "5.5.0",
19
+ "@eslint/js": "9.9.1",
20
+ "@typescript-eslint/parser": "^8.3.0",
16
21
  "astro": "4.10.2",
22
+ "astro-eslint-parser": "1.0.2",
23
+ "eslint": "9.9.1",
24
+ "eslint-plugin-astro": "1.2.3",
25
+ "eslint-plugin-react": "7.35.0",
26
+ "eslint-plugin-simple-import-sort": "12.1.1",
27
+ "eslint-plugin-svelte": "2.43.0",
28
+ "husky": "9.1.5",
29
+ "lint-staged": "15.2.9",
17
30
  "react": "18.3.1",
18
31
  "react-dom": "18.3.1",
19
32
  "sass": "1.77.5",
20
33
  "svelte": "4.2.18",
21
- "typescript": "5.4.5"
34
+ "svelte-eslint-parser": "0.41.0",
35
+ "typescript": "5.4.5",
36
+ "typescript-eslint": "8.3.0"
22
37
  },
23
38
  "exports": {
24
39
  ".": "./index.js",
@@ -69,5 +84,8 @@
69
84
  },
70
85
  "bugs": {
71
86
  "url": "https://github.com/Frontendland/webcoreui/issues"
87
+ },
88
+ "lint-staged": {
89
+ "*.{js,ts,jsx,tsx,svelte,astro}": "eslint src/**/*"
72
90
  }
73
91
  }
package/react.d.ts CHANGED
@@ -8,14 +8,17 @@ import type { ReactCardProps } from './components/Card/card'
8
8
  import type { ReactCheckboxProps } from './components/Checkbox/checkbox'
9
9
  import type { ReactCollapsibleProps } from './components/Collapsible/collapsible'
10
10
  import type { ReactConditionalWrapperProps } from './components/ConditionalWrapper/conditionalwrapper'
11
+ import type { ReactGroupProps } from './components/Group/group'
11
12
  import type { IconProps } from './components/Icon/icon'
12
13
  import type { ReactInputProps } from './components/Input/input'
14
+ import type { ReactListProps } from './components/List/list'
13
15
  import type { ReactMenuProps } from './components/Menu/menu'
14
16
  import type { ReactModalProps } from './components/Modal/modal'
15
17
  import type { ReactPopoverProps } from './components/Popover/popover'
16
18
  import type { ProgressProps } from './components/Progress/progress'
17
19
  import type { ReactRadioProps } from './components/Radio/radio'
18
20
  import type { RatingProps } from './components/Rating/rating'
21
+ import type { ReactSelectProps } from './components/Select/select'
19
22
  import type { ReactSheetProps } from './components/Sheet/sheet'
20
23
  import type { ReactSliderProps } from './components/Slider/slider'
21
24
  import type { SpinnerProps } from './components/Spinner/spinner'
@@ -38,14 +41,17 @@ declare module 'webcoreui/react' {
38
41
  export const Checkbox: FC<ReactCheckboxProps>
39
42
  export const Collapsible: FC<ReactCollapsibleProps>
40
43
  export const ConditionalWrapper: FC<ReactConditionalWrapperProps>
44
+ export const Group: FC<ReactGroupProps>
41
45
  export const Icon: FC<IconProps>
42
46
  export const Input: FC<ReactInputProps>
47
+ export const List: FC<ReactListProps>
43
48
  export const Menu: FC<ReactMenuProps>
44
49
  export const Modal: FC<ReactModalProps>
45
50
  export const Popover: FC<ReactPopoverProps>
46
51
  export const Progress: FC<ProgressProps>
47
52
  export const Radio: FC<ReactRadioProps>
48
53
  export const Rating: FC<RatingProps>
54
+ export const Select: FC<ReactSelectProps>
49
55
  export const Sheet: FC<ReactSheetProps>
50
56
  export const Slider: FC<ReactSliderProps>
51
57
  export const Spinner: FC<SpinnerProps>
package/react.js CHANGED
@@ -7,14 +7,17 @@ import CardComponent from './components/Card/Card.tsx'
7
7
  import CheckboxComponent from './components/Checkbox/Checkbox.tsx'
8
8
  import CollapsibleComponent from './components/Collapsible/Collapsible.tsx'
9
9
  import ConditionalWrapperComponent from './components/ConditionalWrapper/ConditionalWrapper.tsx'
10
+ import GroupComponent from './components/Group/Group.tsx'
10
11
  import IconComponent from './components/Icon/Icon.tsx'
11
12
  import InputComponent from './components/Input/Input.tsx'
13
+ import ListComponent from './components/List/List.tsx'
12
14
  import MenuComponent from './components/Menu/Menu.tsx'
13
15
  import ModalComponent from './components/Modal/Modal.tsx'
14
16
  import PopoverComponent from './components/Popover/Popover.tsx'
15
17
  import ProgressComponent from './components/Progress/Progress.tsx'
16
18
  import RadioComponent from './components/Radio/Radio.tsx'
17
19
  import RatingComponent from './components/Rating/Rating.tsx'
20
+ import SelectComponent from './components/Select/Select.tsx'
18
21
  import SheetComponent from './components/Sheet/Sheet.tsx'
19
22
  import SliderComponent from './components/Slider/Slider.tsx'
20
23
  import SpinnerComponent from './components/Spinner/Spinner.tsx'
@@ -36,14 +39,17 @@ export const Card = CardComponent
36
39
  export const Checkbox = CheckboxComponent
37
40
  export const Collapsible = CollapsibleComponent
38
41
  export const ConditionalWrapper = ConditionalWrapperComponent
42
+ export const Group = GroupComponent
39
43
  export const Icon = IconComponent
40
44
  export const Input = InputComponent
45
+ export const List = ListComponent
41
46
  export const Menu = MenuComponent
42
47
  export const Modal = ModalComponent
43
48
  export const Popover = PopoverComponent
44
49
  export const Progress = ProgressComponent
45
50
  export const Radio = RadioComponent
46
51
  export const Rating = RatingComponent
52
+ export const Select = SelectComponent
47
53
  export const Sheet = SheetComponent
48
54
  export const Slider = SliderComponent
49
55
  export const Spinner = SpinnerComponent
@@ -330,18 +330,20 @@
330
330
  }
331
331
 
332
332
  @mixin transition($args...) {
333
- $property: all;
334
- $speed: .3s;
335
-
336
- @each $arg in $args {
337
- @if (meta.type-of($arg) == 'number') {
338
- $speed: $arg;
339
- } @else {
340
- $property: $arg;
333
+ @if (not $disableAnimations) {
334
+ $property: all;
335
+ $speed: .3s;
336
+
337
+ @each $arg in $args {
338
+ @if (meta.type-of($arg) == 'number') {
339
+ $speed: $arg;
340
+ } @else {
341
+ $property: $arg;
342
+ }
341
343
  }
344
+
345
+ transition: $property $speed cubic-bezier(0.4, 0.0, 0.2, 1);
342
346
  }
343
-
344
- transition: $property $speed cubic-bezier(0.4, 0.0, 0.2, 1);
345
347
  }
346
348
 
347
349
  @mixin typography($args...) {
@@ -0,0 +1 @@
1
+ $disableAnimations: false !default;
package/scss/config.scss CHANGED
@@ -2,5 +2,6 @@
2
2
  @import './config/color-palette';
3
3
  @import './config/css-values';
4
4
  @import './config/typography';
5
+ @import './config/variables';
5
6
  @import './config/layout';
6
7
  @import './config/mixins';
@@ -84,6 +84,8 @@ $alignments: (
84
84
  .grid {
85
85
  @include layout(grid, default);
86
86
 
87
+ grid-template-columns: minmax(0, 1fr);
88
+
87
89
  &.col-2 {
88
90
  grid-template-columns: repeat(2, minmax(0, 1fr));
89
91
  }
package/svelte.d.ts CHANGED
@@ -7,14 +7,17 @@ import type { CardProps } from './components/Card/card'
7
7
  import type { SvelteCheckboxProps } from './components/Checkbox/checkbox'
8
8
  import type { CollapsibleProps } from './components/Collapsible/collapsible'
9
9
  import type { ConditionalWrapperProps } from './components/ConditionalWrapper/conditionalwrapper'
10
+ import type { GroupProps } from './components/Group/group'
10
11
  import type { IconProps } from './components/Icon/icon'
11
12
  import type { SvelteInputProps } from './components/Input/input'
13
+ import type { SvelteListProps } from './components/List/list'
12
14
  import type { MenuProps } from './components/Menu/menu'
13
15
  import type { ModalProps } from './components/Modal/modal'
14
16
  import type { PopoverProps } from './components/Popover/popover'
15
17
  import type { ProgressProps } from './components/Progress/progress'
16
18
  import type { SvelteRadioProps } from './components/Radio/radio'
17
19
  import type { RatingProps } from './components/Rating/rating'
20
+ import type { SvelteSelectProps } from './components/Select/select'
18
21
  import type { SheetProps } from './components/Sheet/sheet'
19
22
  import type { SvelteSliderProps } from './components/Slider/slider'
20
23
  import type { SpinnerProps } from './components/Spinner/spinner'
@@ -26,7 +29,7 @@ import type { ThemeSwitcherProps } from './components/ThemeSwitcher/themeswitche
26
29
  import type { TimelineProps } from './components/Timeline/timeline'
27
30
  import type { TimelineItemProps } from './components/TimelineItem/timelineitem'
28
31
  import type { ToastProps } from './components/Toast/toast'
29
-
32
+
30
33
  declare module 'webcoreui/svelte' {
31
34
  export function Accordion(_props: AccordionProps): any
32
35
  export function Alert(_props: AlertProps): any
@@ -37,14 +40,17 @@ declare module 'webcoreui/svelte' {
37
40
  export function Checkbox(_props: SvelteCheckboxProps): any
38
41
  export function Collapsible(_props: CollapsibleProps): any
39
42
  export function ConditionalWrapper(_props: ConditionalWrapperProps): any
43
+ export function Group(_props: GroupProps): any
40
44
  export function Icon(_props: IconProps): any
41
45
  export function Input(_props: SvelteInputProps): any
46
+ export function List(_props: SvelteListProps): any
42
47
  export function Menu(_props: MenuProps): any
43
48
  export function Modal(_props: ModalProps): any
44
49
  export function Popover(_props: PopoverProps): any
45
50
  export function Progress(_props: ProgressProps): any
46
51
  export function Radio(_props: SvelteRadioProps): any
47
52
  export function Rating(_props: RatingProps): any
53
+ export function Select(_props: SvelteSelectProps): any
48
54
  export function Sheet(_props: SheetProps): any
49
55
  export function Slider(_props: SvelteSliderProps): any
50
56
  export function Spinner(_props: SpinnerProps): any
package/svelte.js CHANGED
@@ -7,14 +7,17 @@ import CardComponent from './components/Card/Card.svelte'
7
7
  import CheckboxComponent from './components/Checkbox/Checkbox.svelte'
8
8
  import CollapsibleComponent from './components/Collapsible/Collapsible.svelte'
9
9
  import ConditionalWrapperComponent from './components/ConditionalWrapper/ConditionalWrapper.svelte'
10
+ import GroupComponent from './components/Group/Group.svelte'
10
11
  import IconComponent from './components/Icon/Icon.svelte'
11
12
  import InputComponent from './components/Input/Input.svelte'
13
+ import ListComponent from './components/List/List.svelte'
12
14
  import MenuComponent from './components/Menu/Menu.svelte'
13
15
  import ModalComponent from './components/Modal/Modal.svelte'
14
16
  import PopoverComponent from './components/Popover/Popover.svelte'
15
17
  import ProgressComponent from './components/Progress/Progress.svelte'
16
18
  import RadioComponent from './components/Radio/Radio.svelte'
17
19
  import RatingComponent from './components/Rating/Rating.svelte'
20
+ import SelectComponent from './components/Select/Select.svelte'
18
21
  import SheetComponent from './components/Sheet/Sheet.svelte'
19
22
  import SliderComponent from './components/Slider/Slider.svelte'
20
23
  import SpinnerComponent from './components/Spinner/Spinner.svelte'
@@ -36,14 +39,17 @@ export const Card = CardComponent
36
39
  export const Checkbox = CheckboxComponent
37
40
  export const Collapsible = CollapsibleComponent
38
41
  export const ConditionalWrapper = ConditionalWrapperComponent
42
+ export const Group = GroupComponent
39
43
  export const Icon = IconComponent
40
44
  export const Input = InputComponent
45
+ export const List = ListComponent
41
46
  export const Menu = MenuComponent
42
47
  export const Modal = ModalComponent
43
48
  export const Popover = PopoverComponent
44
49
  export const Progress = ProgressComponent
45
50
  export const Radio = RadioComponent
46
51
  export const Rating = RatingComponent
52
+ export const Select = SelectComponent
47
53
  export const Sheet = SheetComponent
48
54
  export const Slider = SliderComponent
49
55
  export const Spinner = SpinnerComponent
package/utils/cookies.ts CHANGED
@@ -4,17 +4,17 @@ export const setCookie = (name: string, value: string, days: number) => {
4
4
  if (days) {
5
5
  const date = new Date()
6
6
  date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000))
7
- expires = '; expires=' + date.toUTCString()
7
+ expires = `; expires=${date.toUTCString()}`
8
8
  }
9
9
 
10
- document.cookie = name + '=' + (value || '') + expires + '; path=/'
10
+ document.cookie = `${name}=${value || ''}${expires}; path=/`
11
11
  }
12
12
 
13
13
  export const getCookie = (name: string) => {
14
14
  const cookies = document.cookie.split(';')
15
15
 
16
16
  for (const cookie of cookies) {
17
- if (cookie.indexOf(name + '=') > -1) {
17
+ if (cookie.indexOf(`${name}=`) > -1) {
18
18
  return cookie.split('=')[1]
19
19
  }
20
20
  }
@@ -23,6 +23,6 @@ export const getCookie = (name: string) => {
23
23
  }
24
24
 
25
25
  export const removeCookie = (name: string) => {
26
- document.cookie = name + '=; Max-Age=-1;'
26
+ document.cookie = `${name}=; Max-Age=-1;`
27
27
  }
28
28
 
package/utils/debounce.ts CHANGED
@@ -10,7 +10,7 @@ export const debounce = (fn: any, waitFor = 100) => {
10
10
 
11
11
  const debouncedFn = (...args: any[]) => {
12
12
  clear()
13
-
13
+
14
14
  timeout = setTimeout(() => {
15
15
  fn(...args)
16
16
  }, waitFor)
package/utils/event.ts CHANGED
@@ -1,10 +1,10 @@
1
- export const dispatch = (event: string, detail: any) => {
1
+ export const dispatch = (event: string, detail: unknown) => {
2
2
  document.dispatchEvent(new CustomEvent(event, {
3
3
  detail
4
4
  }))
5
5
  }
6
6
 
7
- export const listen = (event: string, callback: (e: any) => any) => {
7
+ export const listen = (event: string, callback: (e: any) => unknown) => {
8
8
  const fn = (e: any) => callback(e.detail)
9
9
 
10
10
  document.addEventListener(event, fn)
@@ -3,21 +3,21 @@ export const clamp = (
3
3
  min: number,
4
4
  max: number
5
5
  ) => Math.min(Math.max(num, min), max)
6
-
6
+
7
7
  export const lerp = (
8
8
  x: number,
9
9
  y: number,
10
10
  z: number
11
- ) => x * (1 - z) + y * z
12
-
11
+ ) => (x * (1 - z)) + (y * z)
12
+
13
13
  export const invlerp = (
14
14
  x: number,
15
15
  y: number,
16
16
  z: number
17
17
  ) => clamp((z - x) / (y - x), 0, 1)
18
-
18
+
19
19
  export const interpolate = (
20
20
  value: number,
21
21
  input: [x: number, y: number],
22
- output: [x: number, y: number],
22
+ output: [x: number, y: number]
23
23
  ) => lerp(output[0], output[1], invlerp(input[0], input[1], value))
package/utils/modal.ts CHANGED
@@ -1,59 +1,122 @@
1
- export const modal = (element: string) => {
2
- const htmlElement = document.querySelector(element) as HTMLElement
1
+ type Callback = {
2
+ trigger: Element | null
3
+ modal: HTMLElement
4
+ }
5
+
6
+ type Modal = {
7
+ trigger: string
8
+ modal: string
9
+ onOpen?: (args: Callback) => unknown
10
+ onClose?: (args: Callback) => unknown
11
+ }
12
+
13
+ export const modal = (config: Modal | string) => {
14
+ const {
15
+ trigger,
16
+ modal,
17
+ onOpen,
18
+ onClose
19
+ } = (typeof config === 'string' ? {} : config) as Modal
20
+
21
+ const modalSelector = typeof config === 'string' ? config : modal
22
+
23
+ const triggerDOM = document.querySelector(trigger)
24
+ const modalDOM = document.querySelector(modalSelector) as HTMLElement
25
+
26
+ if (modalDOM) {
27
+ const closeOptions = modalDOM.dataset.close?.split(',')
3
28
 
4
- if (htmlElement) {
5
29
  const handleClose = {
6
- icon: () => {
7
- const close = htmlElement.querySelector('[data-id="close"]')
30
+ icon() {
31
+ const close = modalDOM.querySelector('[data-id="close"]')
8
32
 
9
33
  const listener = () => {
10
- htmlElement.dataset.show = ''
34
+ modalDOM.dataset.show = ''
11
35
 
12
- close?.removeEventListener('click', listener)
36
+ onClose?.({
37
+ trigger: triggerDOM,
38
+ modal: modalDOM
39
+ })
13
40
  }
14
41
 
15
- close?.addEventListener('click', listener)
42
+ return {
43
+ add: () => close?.addEventListener('click', listener),
44
+ remove: () => close?.removeEventListener('click', listener)
45
+ }
16
46
  },
17
-
18
- esc: () => {
47
+
48
+ esc() {
19
49
  const listener = (event: KeyboardEvent) => {
20
- if (event.key === 'Escape') {
21
- htmlElement.dataset.show = ''
50
+ if (modalDOM.dataset.show && event.key === 'Escape') {
51
+ modalDOM.dataset.show = ''
52
+
53
+ onClose?.({
54
+ trigger: triggerDOM,
55
+ modal: modalDOM
56
+ })
22
57
 
23
- document.removeEventListener('keydown', listener)
24
58
  }
25
59
  }
26
60
 
27
- document.addEventListener('keydown', listener)
61
+ return {
62
+ add: () => document.addEventListener('keydown', listener),
63
+ remove: () => document.removeEventListener('keydown', listener)
64
+ }
28
65
  },
29
-
30
- overlay: () => {
31
- const close = htmlElement.nextElementSibling
66
+
67
+ overlay() {
68
+ const close = modalDOM.nextElementSibling
32
69
 
33
70
  const listener = () => {
34
- htmlElement.dataset.show = ''
71
+ modalDOM.dataset.show = ''
35
72
 
36
- close?.removeEventListener('click', listener)
73
+ onClose?.({
74
+ trigger: triggerDOM,
75
+ modal: modalDOM
76
+ })
37
77
  }
38
78
 
39
- close?.addEventListener('click', listener)
79
+ return {
80
+ add: () => close?.addEventListener('click', listener),
81
+ remove: () => close?.removeEventListener('click', listener)
82
+ }
40
83
  }
41
84
  }
42
85
 
43
- const closeOptions = htmlElement.dataset.close?.split(',')
86
+ const handleOpen = () => {
87
+ modalDOM.dataset.show = 'true'
88
+
89
+ onOpen?.({
90
+ trigger: triggerDOM,
91
+ modal: modalDOM
92
+ })
93
+ }
44
94
 
45
- htmlElement.dataset.show = 'true'
95
+ triggerDOM?.addEventListener('click', handleOpen)
46
96
 
47
97
  closeOptions?.forEach(option => {
48
- handleClose[option as keyof typeof handleClose]()
98
+ handleClose[option as keyof typeof handleClose]().add()
49
99
  })
100
+
101
+ return {
102
+ open() {
103
+ handleOpen()
104
+ },
105
+ remove() {
106
+ triggerDOM?.removeEventListener('click', handleOpen)
107
+
108
+ closeOptions?.forEach(option => {
109
+ handleClose[option as keyof typeof handleClose]().remove()
110
+ })
111
+ }
112
+ }
50
113
  }
51
114
  }
52
115
 
53
- export const closeModal = (element: string) => {
54
- const htmlElement = document.querySelector(element) as HTMLElement
116
+ export const closeModal = (modal: string) => {
117
+ const modalDOM = document.querySelector(modal) as HTMLElement
55
118
 
56
- if (htmlElement) {
57
- htmlElement.dataset.show = ''
119
+ if (modalDOM) {
120
+ modalDOM.dataset.show = ''
58
121
  }
59
122
  }