lupine.components 1.0.3 → 1.0.5

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lupine.components",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "license": "MIT",
5
5
  "author": "uuware.com",
6
6
  "homepage": "https://uuware.com/",
@@ -0,0 +1,191 @@
1
+ import { CssProps, RefProps, VNode, mountComponents } from 'lupine.web';
2
+
3
+ export type ActionSheetCloseProps = () => void;
4
+
5
+ export type ActionSheetShowProps = {
6
+ title: string;
7
+ children: VNode<any>;
8
+ contentMaxHeight?: string;
9
+ closeEvent?: () => void;
10
+ closeWhenClickOutside?: boolean; // default true
11
+ cancelButtonText?: string; // no showing if not set
12
+ zIndex?: string;
13
+ };
14
+
15
+ // because it's over a mask, so it can use primary colors
16
+ export class ActionSheet {
17
+ static hostNode: HTMLElement;
18
+
19
+ static async show({
20
+ title,
21
+ children,
22
+ contentMaxHeight,
23
+ closeEvent,
24
+ closeWhenClickOutside = true,
25
+ cancelButtonText = 'Cancel',
26
+ zIndex,
27
+ }: ActionSheetShowProps): Promise<ActionSheetCloseProps> {
28
+ const onCancel = () => {
29
+ handleClose();
30
+ };
31
+ const onClickContainer = (event: any) => {
32
+ if (closeWhenClickOutside !== false && event.target.className === 'act-sheet-box') {
33
+ handleClose();
34
+ }
35
+ };
36
+ const handleClose = () => {
37
+ closeEvent?.();
38
+ ref.current.classList.remove('animation-open');
39
+ setTimeout(() => {
40
+ base.remove();
41
+ }, 300);
42
+ };
43
+
44
+ const base = document.createElement('div');
45
+ const ref: RefProps = {
46
+ onLoad: async () => {
47
+ setTimeout(() => {
48
+ ref.current.classList.add('animation-open');
49
+ }, 1);
50
+ },
51
+ };
52
+ const cssContainer: CssProps = {
53
+ position: 'fixed',
54
+ top: 0,
55
+ left: 0,
56
+ width: '100%',
57
+ height: '100%',
58
+ backgroundColor: 'var(--cover-mask-bg-color)',
59
+ '.act-sheet-body': {
60
+ display: 'flex',
61
+ flexDirection: 'column',
62
+ textAlign: 'center',
63
+ position: 'fixed',
64
+ bottom: '0px',
65
+ left: '0px',
66
+ width: '100%',
67
+ maxHeight: contentMaxHeight ? contentMaxHeight : '',
68
+ color: 'var(--primary-color)',
69
+ padding: '8px',
70
+ transition: 'all 0.3s',
71
+ transform: 'translateY(100%)',
72
+ '&.animation-open': {
73
+ transform: 'translateY(0)',
74
+ },
75
+ '.act-sheet-title': {
76
+ padding: '20px 15px 10px 15px',
77
+ opacity: 0.5,
78
+ },
79
+ '.act-sheet-content': {
80
+ display: 'flex',
81
+ flexDirection: 'column',
82
+ flex: 1,
83
+ overflowY: 'auto',
84
+ borderRadius: '8px',
85
+ backgroundColor: 'var(--cover-bg-color)', //'#fefefe',
86
+ width: '100%',
87
+ maxWidth: '450px',
88
+ margin: '0 auto',
89
+ },
90
+ '.act-sheet-bottom-item, .act-sheet-item': {
91
+ backgroundColor: 'var(--cover-bg-color)', //'#fefefe',
92
+ padding: '20px 0',
93
+ cursor: 'pointer',
94
+ transition: 'all 0.3s ease',
95
+ width: '100%',
96
+ maxWidth: '450px',
97
+ borderTop: '1px solid var(--primary-border-color)',
98
+ },
99
+ '.act-sheet-bottom-item': {
100
+ borderRadius: '8px',
101
+ margin: '0 auto',
102
+ marginTop: '4px',
103
+ },
104
+ '.act-sheet-bottom-item:hover, .act-sheet-item:hover': {
105
+ fontWeight: 'bold',
106
+ },
107
+ },
108
+ };
109
+ const component = (
110
+ <div css={cssContainer} class='act-sheet-box' onClick={onClickContainer}>
111
+ <div ref={ref} class='act-sheet-body'>
112
+ <div class='act-sheet-content'>
113
+ <div class='act-sheet-title'>{title}</div>
114
+ {children}
115
+ </div>
116
+ {cancelButtonText && (
117
+ <div class='act-sheet-bottom-item' onClick={onCancel}>
118
+ {cancelButtonText}
119
+ </div>
120
+ )}
121
+ </div>
122
+ </div>
123
+ );
124
+ base.style.position = 'fixed';
125
+ base.style.zIndex = zIndex || 'var(--layer-actionsheet-window)';
126
+ document.body.appendChild(base);
127
+ await mountComponents(base, component);
128
+ return handleClose;
129
+ }
130
+ }
131
+
132
+ export const ActionSheetSelectOptionsProps = {
133
+ YesNo: ['Yes', 'No'],
134
+ OkCancel: ['OK'],
135
+ };
136
+ export type ActionSheetSelectProps = Omit<ActionSheetShowProps, 'children'> & {
137
+ options: string[];
138
+ handleClicked: (index: number, close: ActionSheetCloseProps) => void;
139
+ };
140
+
141
+ export class ActionSheetSelect {
142
+ static async show({
143
+ title,
144
+ contentMaxHeight,
145
+ options = ActionSheetSelectOptionsProps.OkCancel,
146
+ closeEvent,
147
+ handleClicked,
148
+ closeWhenClickOutside = true,
149
+ cancelButtonText = 'Cancel',
150
+ }: ActionSheetSelectProps): Promise<ActionSheetCloseProps> {
151
+ const handleClose = await ActionSheet.show({
152
+ title,
153
+ children: (
154
+ <div>
155
+ {options.map((option, index) => (
156
+ <div class='act-sheet-item' key={index} onClick={() => handleClicked(index, handleClose)}>
157
+ {option}
158
+ </div>
159
+ ))}
160
+ </div>
161
+ ),
162
+ contentMaxHeight,
163
+ cancelButtonText,
164
+ closeEvent,
165
+ closeWhenClickOutside,
166
+ });
167
+ return handleClose;
168
+ }
169
+ }
170
+
171
+ export type ActionSheetMessageProps = Omit<ActionSheetShowProps, 'children' | 'handleClicked' | 'closeEvent'> & {
172
+ message: string;
173
+ };
174
+ export class ActionSheetMessage {
175
+ static async show({
176
+ title,
177
+ message,
178
+ contentMaxHeight,
179
+ closeWhenClickOutside = true,
180
+ cancelButtonText = '',
181
+ }: ActionSheetMessageProps): Promise<ActionSheetCloseProps> {
182
+ const handleClose = await ActionSheet.show({
183
+ title,
184
+ children: <div css={{ padding: '0 8px 16px 8px' }}>{message}</div>,
185
+ contentMaxHeight,
186
+ cancelButtonText,
187
+ closeWhenClickOutside,
188
+ });
189
+ return handleClose;
190
+ }
191
+ }
@@ -14,6 +14,7 @@ export type FloatWindowShowProps = {
14
14
  closeEvent?: () => void;
15
15
  handleClicked: (index: number, close: FloatWindowCloseProps) => void;
16
16
  closeWhenClickOutside?: boolean; // default false
17
+ zIndex?: string;
17
18
  };
18
19
 
19
20
  // because it's over a mask, so it can use primary colors
@@ -43,6 +44,7 @@ export class FloatWindow {
43
44
  closeEvent,
44
45
  handleClicked,
45
46
  closeWhenClickOutside = false,
47
+ zIndex,
46
48
  }: FloatWindowShowProps): Promise<FloatWindowCloseProps> {
47
49
  const onClickContainer = (event: any) => {
48
50
  if (closeWhenClickOutside !== false && event.target.className === 'fwin-box') {
@@ -78,7 +80,10 @@ export class FloatWindow {
78
80
 
79
81
  const ref: RefProps = {
80
82
  onLoad: async () => {
81
- ref.current.classList.add('transition', 'animation');
83
+ ref.current.classList.add('transition');
84
+ setTimeout(() => {
85
+ ref.current.classList.add('animation');
86
+ }, 1);
82
87
  setTimeout(() => {
83
88
  // don't need transition for moving
84
89
  ref.current.classList.remove('transition');
@@ -177,7 +182,7 @@ export class FloatWindow {
177
182
  </div>
178
183
  );
179
184
  base.style.position = 'fixed';
180
- base.style.zIndex = 'var(--layer-float-window)';
185
+ base.style.zIndex = zIndex || 'var(--layer-float-window)';
181
186
  document.body.appendChild(base);
182
187
  await mountComponents(base, component);
183
188
  return handleClose;
@@ -1,4 +1,5 @@
1
1
 
2
+ export * from './action-sheet';
2
3
  export * from './button-push-animation';
3
4
  export * from './button';
4
5
  export * from './drag-refresh';
@@ -11,6 +11,7 @@ export const sharedThemes: ThemeProps = {
11
11
  '--layer-modal': '600',
12
12
  '--layer-modal-over': '610',
13
13
  '--layer-float-window': '700',
14
+ '--layer-actionsheet-window': '710',
14
15
  '--layer-menu': '800', // popup menu
15
16
  '--layer-menu-sub': '810',
16
17
  '--layer-notice': '900', // notice, loading, toast