@balikjs/mobile 0.0.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 (104) hide show
  1. package/README.md +33 -0
  2. package/dist/mobile.js +3062 -0
  3. package/dist/styles.css +1 -0
  4. package/package.json +49 -0
  5. package/src/Alert/Alert.jsx +67 -0
  6. package/src/Alert/Alert.module.css +87 -0
  7. package/src/Alert/index.js +1 -0
  8. package/src/Avatar/Avatar.jsx +77 -0
  9. package/src/Avatar/Avatar.module.css +74 -0
  10. package/src/Avatar/index.js +1 -0
  11. package/src/Badge/Badge.jsx +83 -0
  12. package/src/Badge/Badge.module.css +141 -0
  13. package/src/Badge/index.js +1 -0
  14. package/src/BottomNavigation/BottomNavigation.jsx +61 -0
  15. package/src/BottomNavigation/BottomNavigation.module.css +53 -0
  16. package/src/BottomNavigation/index.js +1 -0
  17. package/src/BottomSheet/BottomSheet.jsx +51 -0
  18. package/src/BottomSheet/BottomSheet.module.css +56 -0
  19. package/src/BottomSheet/index.js +1 -0
  20. package/src/Button/Button.jsx +77 -0
  21. package/src/Button/Button.module.css +124 -0
  22. package/src/Button/index.js +1 -0
  23. package/src/Card/Card.jsx +31 -0
  24. package/src/Card/Card.module.css +4 -0
  25. package/src/Card/index.js +1 -0
  26. package/src/Checkbox/Checkbox.jsx +64 -0
  27. package/src/Checkbox/Checkbox.module.css +146 -0
  28. package/src/Checkbox/index.js +1 -0
  29. package/src/Clipboard/Clipboard.jsx +82 -0
  30. package/src/Clipboard/Clipboard.module.css +126 -0
  31. package/src/Clipboard/index.js +1 -0
  32. package/src/CloseButton/CloseButton.jsx +51 -0
  33. package/src/CloseButton/CloseButton.module.css +94 -0
  34. package/src/Confirm/Confirm.jsx +52 -0
  35. package/src/Confirm/Confirm.module.css +5 -0
  36. package/src/Confirm/index.js +1 -0
  37. package/src/Dialog/Dialog.jsx +63 -0
  38. package/src/Dialog/Dialog.module.css +111 -0
  39. package/src/Dialog/index.js +1 -0
  40. package/src/Divider/Divider.jsx +38 -0
  41. package/src/Divider/Divider.module.css +16 -0
  42. package/src/Divider/index.js +1 -0
  43. package/src/Drawer/Drawer.jsx +55 -0
  44. package/src/Drawer/Drawer.module.css +68 -0
  45. package/src/Drawer/index.js +1 -0
  46. package/src/Empty/Empty.jsx +35 -0
  47. package/src/Empty/Empty.module.css +17 -0
  48. package/src/Empty/index.js +1 -0
  49. package/src/Fab/Fab.jsx +91 -0
  50. package/src/Fab/Fab.module.css +94 -0
  51. package/src/Fab/index.js +1 -0
  52. package/src/Input/Input.jsx +53 -0
  53. package/src/Input/Input.module.css +97 -0
  54. package/src/Input/index.js +1 -0
  55. package/src/Link/Link.jsx +31 -0
  56. package/src/Link/Link.module.css +18 -0
  57. package/src/Link/index.js +1 -0
  58. package/src/Popover/Popover.jsx +162 -0
  59. package/src/Popover/Popover.module.css +63 -0
  60. package/src/Popover/index.js +1 -0
  61. package/src/RadioGroup/Radio.jsx +52 -0
  62. package/src/RadioGroup/Radio.module.css +133 -0
  63. package/src/RadioGroup/RadioGroup.jsx +36 -0
  64. package/src/RadioGroup/RadioGroup.module.css +23 -0
  65. package/src/RadioGroup/index.js +2 -0
  66. package/src/SearchInput/SearchInput.jsx +89 -0
  67. package/src/SearchInput/SearchInput.module.css +169 -0
  68. package/src/SearchInput/index.js +1 -0
  69. package/src/Select/Select.jsx +101 -0
  70. package/src/Select/Select.module.css +174 -0
  71. package/src/Select/index.js +1 -0
  72. package/src/SelectPc/Select.jsx +88 -0
  73. package/src/SelectPc/SelectPc.module.css +132 -0
  74. package/src/SelectPc/index.js +1 -0
  75. package/src/Skeleton/Skeleton.jsx +55 -0
  76. package/src/Skeleton/Skeleton.module.css +33 -0
  77. package/src/Skeleton/index.js +1 -0
  78. package/src/Slider/Slider.jsx +50 -0
  79. package/src/Slider/Slider.module.css +77 -0
  80. package/src/Slider/index.js +1 -0
  81. package/src/Spinner/Spinner.jsx +45 -0
  82. package/src/Spinner/Spinner.module.css +35 -0
  83. package/src/Spinner/index.js +1 -0
  84. package/src/Switch/Switch.jsx +51 -0
  85. package/src/Switch/Switch.module.css +156 -0
  86. package/src/Switch/index.js +1 -0
  87. package/src/Tabs/Tabs.jsx +75 -0
  88. package/src/Tabs/Tabs.module.css +45 -0
  89. package/src/Tabs/index.js +1 -0
  90. package/src/Tag/Tag.jsx +74 -0
  91. package/src/Tag/Tag.module.css +128 -0
  92. package/src/Tag/index.js +1 -0
  93. package/src/Textarea/Textarea.jsx +52 -0
  94. package/src/Textarea/Textarea.module.css +89 -0
  95. package/src/Textarea/index.js +1 -0
  96. package/src/Toast/Toast.jsx +169 -0
  97. package/src/Toast/Toast.module.css +152 -0
  98. package/src/Toast/index.js +1 -0
  99. package/src/Tooltip/Tooltip.jsx +42 -0
  100. package/src/Tooltip/Tooltip.module.css +41 -0
  101. package/src/Tooltip/index.js +1 -0
  102. package/src/index.js +34 -0
  103. package/src/styles/index.css +90 -0
  104. package/src/styles/tokens.css +227 -0
@@ -0,0 +1,146 @@
1
+ .root {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ gap: var(--_ctrl-gap, 10px);
5
+ min-height: var(--_ctrl-min-height, var(--b-comp-height-md));
6
+ cursor: pointer;
7
+ font-family: inherit;
8
+ user-select: none;
9
+ touch-action: manipulation;
10
+ }
11
+
12
+ .root[data-disabled] {
13
+ cursor: not-allowed;
14
+ }
15
+
16
+ .control {
17
+ width: var(--_ctrl-size, var(--b-comp-secondary-height-md));
18
+ height: var(--_ctrl-size, var(--b-comp-secondary-height-md));
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ flex-shrink: 0;
23
+ border-radius: var(--_ctrl-radius, var(--b-radius-l1-md));
24
+ border: 1px solid var(--base-edge);
25
+ background-color: var(--base-bg);
26
+ color: transparent;
27
+ transition: background-color var(--b-transition-fast),
28
+ border-color var(--b-transition-fast),
29
+ color var(--b-transition-fast);
30
+ }
31
+
32
+ .control[data-state="checked"],
33
+ .control[data-state="indeterminate"] {
34
+ background-color: var(--base-edge);
35
+ border-color: var(--base-edge);
36
+ color: var(--base-bg);
37
+ }
38
+
39
+ .root[data-disabled] .control {
40
+ background-color: var(--color-disabled-bg);
41
+ border-color: var(--color-disabled-border);
42
+ color: var(--base-bg);
43
+ }
44
+
45
+ .root[data-disabled] .control[data-state="checked"],
46
+ .root[data-disabled] .control[data-state="indeterminate"] {
47
+ color: var(--color-disabled-fg);
48
+ }
49
+
50
+ .root[data-invalid] .control {
51
+ border-color: var(--color-danger);
52
+ }
53
+
54
+ .root[data-invalid] .control[data-state="checked"],
55
+ .root[data-invalid] .control[data-state="indeterminate"] {
56
+ background-color: var(--color-danger);
57
+ border-color: var(--color-danger);
58
+ }
59
+
60
+ .control:active:not([data-disabled]) {
61
+ transform: scale(0.88);
62
+ }
63
+
64
+ .indicator {
65
+ display: flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ font-size: var(--_ctrl-icon-size, 12px);
69
+ }
70
+
71
+ .indicator svg {
72
+ width: 1em;
73
+ height: 1em;
74
+ }
75
+
76
+ .label {
77
+ font-size: var(--_ctrl-font-size, var(--b-comp-font-size-md));
78
+ line-height: var(--_ctrl-line-height, var(--b-comp-line-height-md));
79
+ color: var(--base-fg);
80
+ }
81
+
82
+ .root[data-disabled] .label {
83
+ color: var(--color-disabled-fg);
84
+ }
85
+
86
+ /* ─── Size Overrides ─── */
87
+
88
+ .sizeXs {
89
+ --_ctrl-size: var(--b-comp-secondary-height-xs);
90
+ --_ctrl-radius: var(--b-radius-l1-xs);
91
+ --_ctrl-gap: 8px;
92
+ --_ctrl-min-height: var(--b-comp-height-xs);
93
+ --_ctrl-font-size: var(--b-comp-font-size-xs);
94
+ --_ctrl-line-height: var(--b-comp-line-height-xs);
95
+ --_ctrl-icon-size: 10px;
96
+ }
97
+
98
+ .sizeSm {
99
+ --_ctrl-size: var(--b-comp-secondary-height-sm);
100
+ --_ctrl-radius: var(--b-radius-l1-sm);
101
+ --_ctrl-gap: 9px;
102
+ --_ctrl-min-height: var(--b-comp-height-sm);
103
+ --_ctrl-font-size: var(--b-comp-font-size-sm);
104
+ --_ctrl-line-height: var(--b-comp-line-height-sm);
105
+ --_ctrl-icon-size: 11px;
106
+ }
107
+
108
+ .sizeMd {
109
+ --_ctrl-size: var(--b-comp-secondary-height-md);
110
+ --_ctrl-radius: var(--b-radius-l1-md);
111
+ --_ctrl-gap: 10px;
112
+ --_ctrl-min-height: var(--b-comp-height-md);
113
+ --_ctrl-font-size: var(--b-comp-font-size-md);
114
+ --_ctrl-line-height: var(--b-comp-line-height-md);
115
+ --_ctrl-icon-size: 12px;
116
+ }
117
+
118
+ .sizeLg {
119
+ --_ctrl-size: var(--b-comp-secondary-height-lg);
120
+ --_ctrl-radius: var(--b-radius-l1-lg);
121
+ --_ctrl-gap: 11px;
122
+ --_ctrl-min-height: var(--b-comp-height-lg);
123
+ --_ctrl-font-size: var(--b-comp-font-size-lg);
124
+ --_ctrl-line-height: var(--b-comp-line-height-lg);
125
+ --_ctrl-icon-size: 13px;
126
+ }
127
+
128
+ .sizeXl {
129
+ --_ctrl-size: var(--b-comp-secondary-height-xl);
130
+ --_ctrl-radius: var(--b-radius-l1-xl);
131
+ --_ctrl-gap: 12px;
132
+ --_ctrl-min-height: var(--b-comp-height-xl);
133
+ --_ctrl-font-size: var(--b-comp-font-size-xl);
134
+ --_ctrl-line-height: var(--b-comp-line-height-xl);
135
+ --_ctrl-icon-size: 14px;
136
+ }
137
+
138
+ .size2xl {
139
+ --_ctrl-size: var(--b-comp-secondary-height-2xl);
140
+ --_ctrl-radius: var(--b-radius-l1-2xl);
141
+ --_ctrl-gap: 16px;
142
+ --_ctrl-min-height: var(--b-comp-height-2xl);
143
+ --_ctrl-font-size: var(--b-comp-font-size-2xl);
144
+ --_ctrl-line-height: var(--b-comp-line-height-2xl);
145
+ --_ctrl-icon-size: 18px;
146
+ }
@@ -0,0 +1 @@
1
+ export { Checkbox } from './Checkbox.jsx'
@@ -0,0 +1,82 @@
1
+ import { splitProps, mergeProps, createSignal, onCleanup } from 'solid-js'
2
+ import { Copy, Check } from 'lucide-solid'
3
+ import styles from './Clipboard.module.css'
4
+
5
+ const sizes = {
6
+ xs: styles.sizeXs,
7
+ sm: styles.sizeSm,
8
+ md: styles.sizeMd,
9
+ lg: styles.sizeLg,
10
+ xl: styles.sizeXl,
11
+ }
12
+
13
+ const DEFAULT_PROPS = {
14
+ size: 'md',
15
+ copiedDuration: 2000,
16
+ toastOnCopy: false,
17
+ }
18
+
19
+ /**
20
+ * @param {import('solid-js').JSX.ButtonHTMLAttributes<HTMLButtonElement> & {
21
+ * value: string
22
+ * size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'
23
+ * copiedDuration?: number
24
+ * toastOnCopy?: boolean
25
+ * class?: string
26
+ * }} props
27
+ */
28
+ export function Clipboard(props) {
29
+ const [local, rest] = splitProps(
30
+ mergeProps(DEFAULT_PROPS, props),
31
+ ['value', 'size', 'class', 'copiedDuration', 'toastOnCopy', 'children'],
32
+ )
33
+
34
+ const [copied, setCopied] = createSignal(false)
35
+ let timer = null
36
+
37
+ const handleCopy = async () => {
38
+ try {
39
+ await navigator.clipboard.writeText(local.value)
40
+ } catch {
41
+ const textarea = document.createElement('textarea')
42
+ textarea.value = local.value
43
+ textarea.style.position = 'fixed'
44
+ textarea.style.opacity = '0'
45
+ document.body.appendChild(textarea)
46
+ textarea.select()
47
+ document.execCommand('copy')
48
+ document.body.removeChild(textarea)
49
+ }
50
+
51
+ setCopied(true)
52
+ clearTimeout(timer)
53
+ timer = setTimeout(() => setCopied(false), local.copiedDuration)
54
+ }
55
+
56
+ onCleanup(() => clearTimeout(timer))
57
+
58
+ return (
59
+ <button
60
+ {...rest}
61
+ type="button"
62
+ onClick={handleCopy}
63
+ class={[
64
+ 'balik-clipboard',
65
+ `balik-clipboard--${local.size}`,
66
+ styles.base,
67
+ sizes[local.size],
68
+ copied() && styles.copied,
69
+ local.class,
70
+ ]
71
+ .filter(Boolean)
72
+ .join(' ')}
73
+ >
74
+ {copied() ? (
75
+ <Check aria-hidden="true" class={styles.icon} />
76
+ ) : (
77
+ <Copy aria-hidden="true" class={styles.icon} />
78
+ )}
79
+ {local.children}
80
+ </button>
81
+ )
82
+ }
@@ -0,0 +1,126 @@
1
+ .base {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: 6px;
6
+ border: none;
7
+ border-radius: var(--_border-radius);
8
+ font-family: inherit;
9
+ cursor: pointer;
10
+ outline: none;
11
+ color: var(--color-disabled-fg);
12
+ background-color: transparent;
13
+ user-select: none;
14
+ touch-action: manipulation;
15
+ -webkit-tap-highlight-color: transparent;
16
+ transition: background-color var(--b-transition-fast),
17
+ color var(--b-transition-fast);
18
+ }
19
+
20
+ @media (hover: hover) {
21
+ .base:hover {
22
+ color: var(--base-fg);
23
+ background-color: color-mix(in oklch, var(--base-fg) 6%, var(--base-bg));
24
+ }
25
+ }
26
+
27
+ .base:focus {
28
+ outline: none;
29
+ background-color: transparent;
30
+ }
31
+
32
+ .base:focus-visible {
33
+ color: var(--base-fg);
34
+ outline: 2px solid var(--color-focus-border);
35
+ outline-offset: 2px;
36
+ background-color: transparent;
37
+ }
38
+
39
+ .base:active {
40
+ background-color: transparent;
41
+ }
42
+
43
+ .icon {
44
+ flex-shrink: 0;
45
+ }
46
+
47
+ .copied {
48
+ color: var(--color-success);
49
+ }
50
+
51
+ @media (hover: hover) {
52
+ .copied:hover {
53
+ color: var(--color-success);
54
+ background-color: color-mix(in oklch, var(--color-success) 10%, var(--base-bg));
55
+ }
56
+ }
57
+
58
+ .sizeXs {
59
+ height: 28px;
60
+ width: 28px;
61
+ min-width: 28px;
62
+ padding: 0;
63
+ --_border-radius: var(--b-radius-l1-xs);
64
+ --_icon-size: 14px;
65
+ }
66
+
67
+ .sizeXs .icon {
68
+ width: 14px;
69
+ height: 14px;
70
+ }
71
+
72
+ .sizeSm {
73
+ height: 32px;
74
+ width: 32px;
75
+ min-width: 32px;
76
+ padding: 0;
77
+ --_border-radius: var(--b-radius-l1-sm);
78
+ --_icon-size: 16px;
79
+ }
80
+
81
+ .sizeSm .icon {
82
+ width: 16px;
83
+ height: 16px;
84
+ }
85
+
86
+ .sizeMd {
87
+ height: 36px;
88
+ width: 36px;
89
+ min-width: 36px;
90
+ padding: 0;
91
+ --_border-radius: var(--b-radius-l1-md);
92
+ --_icon-size: 18px;
93
+ }
94
+
95
+ .sizeMd .icon {
96
+ width: 18px;
97
+ height: 18px;
98
+ }
99
+
100
+ .sizeLg {
101
+ height: 40px;
102
+ width: 40px;
103
+ min-width: 40px;
104
+ padding: 0;
105
+ --_border-radius: var(--b-radius-l1-lg);
106
+ --_icon-size: 20px;
107
+ }
108
+
109
+ .sizeLg .icon {
110
+ width: 20px;
111
+ height: 20px;
112
+ }
113
+
114
+ .sizeXl {
115
+ height: 44px;
116
+ width: 44px;
117
+ min-width: 44px;
118
+ padding: 0;
119
+ --_border-radius: var(--b-radius-l1-xl);
120
+ --_icon-size: 22px;
121
+ }
122
+
123
+ .sizeXl .icon {
124
+ width: 22px;
125
+ height: 22px;
126
+ }
@@ -0,0 +1 @@
1
+ export { Clipboard } from './Clipboard.jsx'
@@ -0,0 +1,51 @@
1
+ import { splitProps, mergeProps } from 'solid-js'
2
+ import { X } from 'lucide-solid'
3
+ import styles from './CloseButton.module.css'
4
+
5
+ const sizeMap = {
6
+ xs: styles.sizeXs,
7
+ sm: styles.sizeSm,
8
+ md: styles.sizeMd,
9
+ lg: styles.sizeLg,
10
+ xl: styles.sizeXl,
11
+ '2xl': styles.size2xl,
12
+ }
13
+
14
+ const DEFAULT_PROPS = {
15
+ size: 'md',
16
+ rounded: false,
17
+ }
18
+
19
+ /**
20
+ * @param {import('solid-js').JSX.ButtonHTMLAttributes<HTMLButtonElement> & {
21
+ * size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'
22
+ * rounded?: boolean
23
+ * class?: string
24
+ * }} props
25
+ */
26
+ export function CloseButton(props) {
27
+ const [local, rest] = splitProps(
28
+ mergeProps(DEFAULT_PROPS, props),
29
+ ['size', 'rounded', 'class'],
30
+ )
31
+
32
+ return (
33
+ <button
34
+ {...rest}
35
+ type="button"
36
+ aria-label="Close"
37
+ class={[
38
+ 'balik-close-button',
39
+ `balik-close-button--${local.size}`,
40
+ styles.base,
41
+ sizeMap[local.size],
42
+ local.rounded && styles.rounded,
43
+ local.class,
44
+ ]
45
+ .filter(Boolean)
46
+ .join(' ')}
47
+ >
48
+ <X aria-hidden="true" />
49
+ </button>
50
+ )
51
+ }
@@ -0,0 +1,94 @@
1
+ .base {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ padding: 0;
6
+ border: none;
7
+ border-radius: var(--b-radius-l1-md);
8
+ background: transparent;
9
+ color: color-mix(in oklch, var(--base-fg) 40%, transparent);
10
+ cursor: pointer;
11
+ transition:
12
+ color var(--b-transition-fast),
13
+ background-color var(--b-transition-fast);
14
+ }
15
+
16
+ .base:hover {
17
+ color: var(--base-fg);
18
+ background-color: color-mix(in oklch, var(--base-fg) 8%, transparent);
19
+ }
20
+
21
+ .base:focus-visible {
22
+ outline: 2px solid var(--base-edge);
23
+ outline-offset: 2px;
24
+ }
25
+
26
+ .base svg {
27
+ display: block;
28
+ pointer-events: none;
29
+ }
30
+
31
+ .sizeXs {
32
+ width: var(--b-comp-height-xs);
33
+ height: var(--b-comp-height-xs);
34
+ border-radius: var(--b-radius-l1-xs);
35
+ }
36
+
37
+ .sizeXs svg {
38
+ width: 16px;
39
+ height: 16px;
40
+ }
41
+
42
+ .sizeSm {
43
+ width: var(--b-comp-height-sm);
44
+ height: var(--b-comp-height-sm);
45
+ }
46
+
47
+ .sizeSm svg {
48
+ width: 18px;
49
+ height: 18px;
50
+ }
51
+
52
+ .sizeMd {
53
+ width: var(--b-comp-height-md);
54
+ height: var(--b-comp-height-md);
55
+ }
56
+
57
+ .sizeMd svg {
58
+ width: 20px;
59
+ height: 20px;
60
+ }
61
+
62
+ .sizeLg {
63
+ width: var(--b-comp-height-lg);
64
+ height: var(--b-comp-height-lg);
65
+ }
66
+
67
+ .sizeLg svg {
68
+ width: 22px;
69
+ height: 22px;
70
+ }
71
+
72
+ .sizeXl {
73
+ width: var(--b-comp-height-xl);
74
+ height: var(--b-comp-height-xl);
75
+ }
76
+
77
+ .sizeXl svg {
78
+ width: 24px;
79
+ height: 24px;
80
+ }
81
+
82
+ .size2xl {
83
+ width: var(--b-comp-height-2xl);
84
+ height: var(--b-comp-height-2xl);
85
+ }
86
+
87
+ .size2xl svg {
88
+ width: 32px;
89
+ height: 32px;
90
+ }
91
+
92
+ .rounded {
93
+ border-radius: 50%;
94
+ }
@@ -0,0 +1,52 @@
1
+ import { splitProps, mergeProps } from 'solid-js'
2
+ import { Dialog } from '../Dialog/Dialog.jsx'
3
+ import { Button } from '../Button/Button.jsx'
4
+ import styles from './Confirm.module.css'
5
+
6
+ const DEFAULT_PROPS = {
7
+ closeable: false,
8
+ confirmLabel: 'Confirm',
9
+ cancelLabel: 'Cancel',
10
+ danger: false,
11
+ loading: false,
12
+ }
13
+
14
+ /**
15
+ * @param {import('../Dialog/Dialog.jsx').DialogProps & {
16
+ * confirmLabel?: string
17
+ * cancelLabel?: string
18
+ * danger?: boolean
19
+ * loading?: boolean
20
+ * onConfirm?: () => void
21
+ * onCancel?: () => void
22
+ * }} props
23
+ */
24
+ export function Confirm(props) {
25
+ const [local, rest] = splitProps(
26
+ mergeProps(DEFAULT_PROPS, props),
27
+ ['confirmLabel', 'cancelLabel', 'danger', 'loading', 'closeable', 'onConfirm', 'onCancel', 'onOpenChange', 'class', 'children'],
28
+ )
29
+
30
+ const handleConfirm = () => {
31
+ local.onConfirm?.()
32
+ }
33
+
34
+ const handleCancel = () => {
35
+ local.onCancel?.()
36
+ local.onOpenChange?.({ open: false })
37
+ }
38
+
39
+ return (
40
+ <Dialog {...rest} closeable={local.closeable} onOpenChange={local.onOpenChange} class={local.class}>
41
+ {local.children}
42
+ <div class={styles.actions}>
43
+ <Button size="sm" onClick={handleCancel}>
44
+ {local.cancelLabel}
45
+ </Button>
46
+ <Button size="sm" solid danger={local.danger} loading={local.loading} onClick={handleConfirm}>
47
+ {local.confirmLabel}
48
+ </Button>
49
+ </div>
50
+ </Dialog>
51
+ )
52
+ }
@@ -0,0 +1,5 @@
1
+ .actions {
2
+ display: flex;
3
+ gap: var(--b-spacing-sm);
4
+ justify-content: flex-end;
5
+ }
@@ -0,0 +1 @@
1
+ export { Confirm } from './Confirm.jsx'
@@ -0,0 +1,63 @@
1
+ import { splitProps, mergeProps } from 'solid-js'
2
+ import { Portal } from 'solid-js/web'
3
+ import { Dialog as ArkDialog } from '@ark-ui/solid'
4
+ import { CloseButton } from '../CloseButton/CloseButton.jsx'
5
+ import styles from './Dialog.module.css'
6
+
7
+ const DEFAULT_PROPS = {
8
+ modal: true,
9
+ lazyMount: true,
10
+ unmountOnExit: true,
11
+ closeable: true,
12
+ }
13
+
14
+ /**
15
+ * @param {import('@ark-ui/solid').DialogRootProps & {
16
+ * title?: string
17
+ * description?: string
18
+ * closeable?: boolean
19
+ * class?: string
20
+ * }} props
21
+ */
22
+ export function Dialog(props) {
23
+ const [local, rest] = splitProps(
24
+ mergeProps(DEFAULT_PROPS, props),
25
+ ['title', 'description', 'class', 'children', 'modal', 'lazyMount', 'unmountOnExit', 'closeable'],
26
+ )
27
+
28
+ return (
29
+ <ArkDialog.Root {...rest} modal={local.modal} lazyMount={local.lazyMount} unmountOnExit={local.unmountOnExit}>
30
+ <Portal mount={document.body}>
31
+ <ArkDialog.Backdrop class={styles.backdrop} />
32
+ <ArkDialog.Positioner class={styles.positioner}>
33
+ <ArkDialog.Content
34
+ class={[
35
+ 'balik-dialog',
36
+ styles.content,
37
+ local.class,
38
+ ]
39
+ .filter(Boolean)
40
+ .join(' ')}
41
+ >
42
+ {local.title && (
43
+ <ArkDialog.Title class={styles.title}>
44
+ {local.title}
45
+ </ArkDialog.Title>
46
+ )}
47
+ {local.description && (
48
+ <ArkDialog.Description class={styles.description}>
49
+ {local.description}
50
+ </ArkDialog.Description>
51
+ )}
52
+ <div class={styles.body}>{local.children}</div>
53
+ {local.closeable && (
54
+ <ArkDialog.CloseTrigger asChild={CloseButton} class={styles.close} />
55
+ )}
56
+ </ArkDialog.Content>
57
+ </ArkDialog.Positioner>
58
+ </Portal>
59
+ </ArkDialog.Root>
60
+ )
61
+ }
62
+
63
+ Dialog.Original = ArkDialog