webcake-ui-kit 1.1.28 → 1.1.30

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 (44) hide show
  1. package/package.json +7 -2
  2. package/src/components/alert/Alert.vue +3 -2
  3. package/src/components/alert/alert.css +29 -3
  4. package/src/components/date-picker/CalendarPanel.vue +154 -0
  5. package/src/components/date-picker/CalendarView.vue +104 -0
  6. package/src/components/date-picker/DatePicker.vue +587 -0
  7. package/src/components/date-picker/PanelFooter.vue +45 -0
  8. package/src/components/date-picker/PanelHeader.vue +102 -0
  9. package/src/components/date-picker/TimePanel.vue +98 -0
  10. package/src/components/date-picker/calendar-panel.css +36 -0
  11. package/src/components/date-picker/calendar-view.css +134 -0
  12. package/src/components/date-picker/calendar.js +116 -0
  13. package/src/components/date-picker/date-picker.css +95 -0
  14. package/src/components/date-picker/dayjs.js +34 -0
  15. package/src/components/date-picker/panel-footer.css +42 -0
  16. package/src/components/date-picker/panel-header.css +71 -0
  17. package/src/components/date-picker/time-panel.css +63 -0
  18. package/src/components/dropdown/Dropdown.vue +14 -2
  19. package/src/components/dropdown/DropdownMenuItems.vue +7 -3
  20. package/src/components/dropdown/dropdown-menu-items.css +4 -11
  21. package/src/components/input/input.css +7 -2
  22. package/src/components/menu/Menu.vue +7 -2
  23. package/src/components/menu/menu.css +0 -1
  24. package/src/components/message/Message.vue +72 -0
  25. package/src/components/message/MessageContainer.vue +200 -0
  26. package/src/components/message/message-container.css +108 -0
  27. package/src/components/message/message.css +69 -0
  28. package/src/components/message/message.js +133 -0
  29. package/src/components/progress/Progress.vue +42 -0
  30. package/src/components/progress/progress.css +15 -0
  31. package/src/components/radio/Radio.vue +1 -1
  32. package/src/components/radio-group/RadioGroup.vue +2 -2
  33. package/src/components/select/Select.vue +5 -1
  34. package/src/components/select/select.css +13 -7
  35. package/src/components/select-option/SelectOption.vue +6 -0
  36. package/src/components/select-option/select_option.css +20 -0
  37. package/src/components/table/Table.vue +434 -92
  38. package/src/components/table/table.css +178 -5
  39. package/src/components/tooltip/Tooltip.vue +6 -3
  40. package/src/floating/click-outside-mixin.js +21 -1
  41. package/src/index.js +5 -0
  42. package/src/styles/color_general.css +20 -12
  43. package/src/styles/raw_colors.css +4 -4
  44. package/src/styles/shadow.css +3 -0
@@ -2,6 +2,9 @@
2
2
  width: 100%;
3
3
  font-family: var(--font-family-body);
4
4
  color: var(--primary-fg);
5
+ border: 1px solid var(--border-primary);
6
+ border-radius: var(--rounded-2xl);
7
+ overflow: hidden;
5
8
  }
6
9
 
7
10
  .ui-table__table {
@@ -10,6 +13,11 @@
10
13
  border-spacing: 0;
11
14
  }
12
15
 
16
+ /* drag col is always 36px — the header cell is empty so it has no content to size it */
17
+ .ui-table__col--drag {
18
+ width: 1%;
19
+ }
20
+
13
21
  .ui-table__col--selection {
14
22
  width: 1%;
15
23
  }
@@ -40,17 +48,143 @@
40
48
  text-overflow: ellipsis;
41
49
  }
42
50
 
51
+ .ui-table__cell--drag {
52
+ width: 1%;
53
+ white-space: nowrap;
54
+ text-align: center;
55
+ }
56
+
57
+ .ui-table__td.ui-table__cell--drag {
58
+ cursor: grab;
59
+ color: var(--muted-fg);
60
+ }
61
+
62
+ .ui-table__td.ui-table__cell--drag:active {
63
+ cursor: grabbing;
64
+ }
65
+
43
66
  .ui-table__cell--selection {
44
67
  width: 1%;
45
68
  white-space: nowrap;
46
69
  text-align: center;
47
70
  }
48
71
 
72
+ .ui-table__cell--fixed-left,
73
+ .ui-table__cell--fixed-right {
74
+ position: sticky;
75
+ z-index: 1;
76
+ }
77
+
78
+ @keyframes ui-table-sticky-shadow {
79
+ to {
80
+ opacity: 1;
81
+ }
82
+ }
83
+
84
+ @keyframes ui-table-sticky-shadow-right {
85
+ to {
86
+ opacity: 0;
87
+ }
88
+ }
89
+
90
+ .ui-table__cell--fixed-left-last::after {
91
+ content: '';
92
+ position: absolute;
93
+ top: 0;
94
+ right: -6px;
95
+ bottom: 0;
96
+ width: 6px;
97
+ box-shadow: inset var(--shadow-fixed-column-left);
98
+ pointer-events: none;
99
+ opacity: 0;
100
+ animation: ui-table-sticky-shadow linear both;
101
+ animation-timeline: scroll(nearest x);
102
+ animation-range: 0px 1px;
103
+ }
104
+
105
+ .ui-table__cell--fixed-right-first::after {
106
+ content: '';
107
+ position: absolute;
108
+ top: 0;
109
+ left: -6px;
110
+ bottom: 0;
111
+ width: 6px;
112
+ box-shadow: inset var(--shadow-fixed-column-right);
113
+ pointer-events: none;
114
+ animation: ui-table-sticky-shadow-right linear both;
115
+ animation-timeline: scroll(nearest x);
116
+ animation-range: calc(100% - 2px) 100%;
117
+ }
118
+
119
+ /* Sticky cells need an opaque background so content doesn't bleed through. */
120
+ .ui-table__th.ui-table__cell--fixed-left,
121
+ .ui-table__th.ui-table__cell--fixed-right {
122
+ background: var(--secondary-bg);
123
+ }
124
+
125
+ .ui-table__td.ui-table__cell--fixed-left,
126
+ .ui-table__td.ui-table__cell--fixed-right {
127
+ background: var(--primary-bg);
128
+ transition: background-color 0.12s ease;
129
+ }
130
+
131
+ .ui-table__row--body:hover .ui-table__td.ui-table__cell--fixed-left,
132
+ .ui-table__row--body:hover .ui-table__td.ui-table__cell--fixed-right {
133
+ background: var(--accent-bg);
134
+ }
135
+
136
+ .ui-table__row--selected .ui-table__td.ui-table__cell--fixed-left,
137
+ .ui-table__row--selected .ui-table__td.ui-table__cell--fixed-right {
138
+ background: var(--secondary-bg);
139
+ }
140
+
49
141
  /* ---------- Header ---------- */
50
142
  .ui-table__th {
51
143
  background: var(--secondary-bg);
52
144
  font-weight: var(--paragraph-medium-font-weight);
53
145
  white-space: nowrap;
146
+ padding: 0;
147
+ }
148
+
149
+ .ui-table__th-inner-wrap {
150
+ padding: var(--spacing-xs);
151
+ position: relative;
152
+ }
153
+
154
+ .ui-table__resize-handle {
155
+ position: absolute;
156
+ top: 50%;
157
+ right: -4px;
158
+ width: 8px;
159
+ height: 50%;
160
+ transform: translateY(-50%);
161
+ cursor: col-resize;
162
+ }
163
+
164
+ .ui-table__resize-handle:hover {
165
+ height: 100%;
166
+ }
167
+
168
+ .ui-table__resize-handle--left {
169
+ right: auto;
170
+ left: -4px;
171
+ }
172
+
173
+ .ui-table__resize-handle::before {
174
+ content: '';
175
+ position: absolute;
176
+ top: 0;
177
+ bottom: 0;
178
+ left: 50%;
179
+ width: 1px;
180
+ transform: translateX(-50%);
181
+ background: var(--border-focus);
182
+ }
183
+
184
+ .ui-table__resize-handle:hover::before,
185
+ .ui-table__resize-handle.resizing::before {
186
+ width: 3px;
187
+ background: #3f8dff;
54
188
  }
55
189
 
56
190
  .ui-table__th-inner {
@@ -65,7 +199,8 @@
65
199
  user-select: none;
66
200
  }
67
201
 
68
- .ui-table__th--sortable:hover {
202
+ .ui-table__th--sortable:hover,
203
+ .ui-table__th:has(:is(.ui-table__resize-handle, .ui-table__resize-handle--left)):hover {
69
204
  background: var(--accent-2);
70
205
  }
71
206
 
@@ -103,6 +238,18 @@
103
238
  transition: background-color 0.12s ease;
104
239
  }
105
240
 
241
+ .ui-table__row--dragging .ui-table__td {
242
+ opacity: 0.35;
243
+ }
244
+
245
+ .ui-table__row--drag-over .ui-table__td {
246
+ border-top: 2px solid var(--border-focus);
247
+ }
248
+
249
+ .ui-table__row--drag-preview .ui-table__td {
250
+ background: var(--accent-bg);
251
+ }
252
+
106
253
  .ui-table__row--body:hover .ui-table__td {
107
254
  background: var(--accent-bg);
108
255
  }
@@ -132,6 +279,18 @@
132
279
  border-right: none;
133
280
  }
134
281
 
282
+ @keyframes ui-table-sticky-border-hide {
283
+ to {
284
+ border-right-width: 0;
285
+ }
286
+ }
287
+
288
+ .ui-table--bordered .ui-table__cell--fixed-left-last {
289
+ animation: ui-table-sticky-border-hide linear both;
290
+ animation-timeline: scroll(nearest x);
291
+ animation-range: 0px 1px;
292
+ }
293
+
135
294
  /* With a scrollbar spacer present, the last real header column is second-to-last. */
136
295
  .ui-table--bordered .ui-table__row--has-scrollbar .ui-table__cell:nth-last-child(2) {
137
296
  border-right: none;
@@ -173,20 +332,34 @@
173
332
 
174
333
  .ui-table__body::-webkit-scrollbar {
175
334
  width: 10px;
335
+ height: 10px;
176
336
  }
177
337
 
178
- .ui-table__body::-webkit-scrollbar-track {
338
+ .ui-table__body::-webkit-scrollbar-track:vertical {
179
339
  border-left: 1px solid var(--border-primary);
180
340
  }
181
341
 
342
+ .ui-table__body::-webkit-scrollbar-track:horizontal {
343
+ border-top: 1px solid var(--border-primary);
344
+ }
345
+
182
346
  .ui-table__body::-webkit-scrollbar-thumb {
183
347
  background: var(--border-primary);
184
348
  border-radius: 3px;
349
+ }
350
+
351
+ .ui-table__body::-webkit-scrollbar-thumb:vertical {
185
352
  border-left: 2px solid transparent;
186
353
  border-right: 1px solid transparent;
187
354
  background-clip: content-box;
188
355
  }
189
356
 
357
+ .ui-table__body::-webkit-scrollbar-thumb:horizontal {
358
+ border-top: 2px solid transparent;
359
+ border-bottom: 1px solid transparent;
360
+ background-clip: content-box;
361
+ }
362
+
190
363
  .ui-table--scroll-y .ui-table__head {
191
364
  overflow: hidden;
192
365
  }
@@ -196,11 +369,11 @@
196
369
  border: none;
197
370
  background: var(--secondary-bg);
198
371
  border-bottom: 1px solid var(--border-primary);
199
- box-sizing: border-box;
200
372
  }
201
373
 
202
- .ui-table--scroll-y .ui-table__cell--selection {
203
- width: 44px;
374
+ .ui-table--scroll-y .ui-table__cell--selection,
375
+ .ui-table--scroll-y .ui-table__cell--drag {
376
+ width: 36px;
204
377
  }
205
378
 
206
379
  /* ---------- Virtual scroll spacers ---------- */
@@ -17,9 +17,10 @@
17
17
  'ui-tooltip__content',
18
18
  `ui-tooltip__content--${color}`,
19
19
  `ui-tooltip__content--${side}`,
20
- hasMaxWidth && 'ui-tooltip__content--wrap'
20
+ hasMaxWidth && 'ui-tooltip__content--wrap',
21
+ overlayClassName
21
22
  ]"
22
- :style="tooltipStyle"
23
+ :style="overlayStyle ? [tooltipStyle, overlayStyle] : tooltipStyle"
23
24
  role="tooltip"
24
25
  >
25
26
  <span class="ui-tooltip__text">
@@ -52,7 +53,9 @@ export default {
52
53
  default: 'default',
53
54
  validator: v => ['default', 'brand', 'destructive'].includes(v)
54
55
  },
55
- arrow: { type: Boolean, default: true }
56
+ arrow: { type: Boolean, default: true },
57
+ overlayClassName: { type: [String, Array, Object], default: null },
58
+ overlayStyle: { type: [Object, Array], default: null }
56
59
  },
57
60
  emits: [],
58
61
  data() {
@@ -12,6 +12,24 @@ export default {
12
12
  this._coTriggerEl = trigger
13
13
  this._coFloatEl = floating
14
14
  },
15
+ // Returns true if `target` is inside a portal-hosted floating panel whose
16
+ // trigger element lives inside `myFloat`. This covers the case where a nested
17
+ // component (e.g. WkSelect inside a WkDropdown overlay) portals its own menu
18
+ // to #wk-portal-root — the nested panel is a sibling in the DOM, not a
19
+ // descendant of myFloat, so a plain `contains()` check misses it.
20
+ _coIsInsideDescendantPortal(target, myFloat) {
21
+ if (!myFloat || typeof document === 'undefined') return false
22
+ const portalRoot = document.querySelector('[data-wk-portal-root]')
23
+ if (!portalRoot || !portalRoot.contains(target)) return false
24
+ const floatingEls = portalRoot.querySelectorAll('[id^="wk-menu-"]')
25
+ for (let i = 0; i < floatingEls.length; i++) {
26
+ const fp = floatingEls[i]
27
+ if (!fp.contains(target)) continue
28
+ const trig = fp._wkTrigger
29
+ if (trig && myFloat.contains(trig)) return true
30
+ }
31
+ return false
32
+ },
15
33
  _coAttach() {
16
34
  if (typeof document === 'undefined' || this.coAttached) return
17
35
  this._coHandler = e => {
@@ -23,7 +41,9 @@ export default {
23
41
  trigger && (path.indexOf(trigger) !== -1 || (trigger.contains && trigger.contains(target)))
24
42
  const insideFloat =
25
43
  floating && (path.indexOf(floating) !== -1 || (floating.contains && floating.contains(target)))
26
- if (!insideTrigger && !insideFloat) this._coOnOutside(e)
44
+ if (!insideTrigger && !insideFloat && !this._coIsInsideDescendantPortal(target, floating)) {
45
+ this._coOnOutside(e)
46
+ }
27
47
  }
28
48
  document.addEventListener('pointerdown', this._coHandler, true)
29
49
  this.coAttached = true
package/src/index.js CHANGED
@@ -20,6 +20,7 @@ export { default as WkInput } from './components/input/Input.vue'
20
20
  export { default as WkInputNumber } from './components/input-number/InputNumber.vue'
21
21
  export { default as WkMenu } from './components/menu/Menu.vue'
22
22
  export { default as WkPagination } from './components/pagination/Pagination.vue'
23
+ export { default as WkProgress } from './components/progress/Progress.vue'
23
24
  export { default as WkRadio } from './components/radio/Radio.vue'
24
25
  export { default as WkRadioGroup } from './components/radio-group/RadioGroup.vue'
25
26
  export { default as WkRichCheckboxGroup } from './components/rich-checkbox-group/RichCheckboxGroup.vue'
@@ -40,3 +41,7 @@ export { default as WkToggle } from './components/toggle/Toggle.vue'
40
41
  export { default as WkToggleGroup } from './components/toggle-group/ToggleGroup.vue'
41
42
  export { default as WkTooltip } from './components/tooltip/Tooltip.vue'
42
43
  export { default as WkTypography } from './components/typography/Typography.vue'
44
+ export { default as WkDatePicker } from './components/date-picker/DatePicker.vue'
45
+
46
+ // Imperative singleton service (no SFC export — mounts its own container to body).
47
+ export { wkMessage } from './components/message/message.js'
@@ -18,6 +18,9 @@
18
18
  --primary-brand-fg: var(--color-brand-shades-600);
19
19
  --inverse-fg: var(--color-white-alpha-100);
20
20
  --destructive: var(--color-red-600);
21
+ --positive: var(--color-emerald-600);
22
+ --warning: var(--color-amber-600);
23
+ --infor: var(--color-blue-600);
21
24
  --destructive-inverse-fg: var(--color-white-alpha-100);
22
25
  --border-primary: var(--color-brand-neutrals-200);
23
26
  --border-secondary: var(--color-brand-neutrals-100);
@@ -28,19 +31,20 @@
28
31
  --primary-hover: var(--color-brand-neutrals-50);
29
32
  --secondary-hover: var(--color-brand-neutrals-50);
30
33
  --primary-brand-hover: var(--color-brand-shades-500);
34
+ --destructive-text: var(--color-red-600);
31
35
  --destructive-hover: var(--color-red-500);
32
36
  --destructive-subtle: var(--color-red-50);
33
37
  --destructive-border: var(--color-red-500);
34
38
  --destructive-border-subtle: var(--color-red-200);
35
- --destructive-text: var(--color-red-600);
36
- --warning-subtle: var(--color-yellow-50);
37
- --warning-border: var(--color-yellow-500);
38
- --warning-border-subtle: var(--color-yellow-200);
39
- --warning-text: var(--color-orange-800);
39
+ --positive-subtle: var(--color-emerald-50);
40
+ --positive-border: var(--color-emerald-500);
41
+ --positive-border-subtle: var(--color-emerald-200);
42
+ --warning-subtle: var(--color-amber-50);
43
+ --warning-border: var(--color-amber-500);
44
+ --warning-border-subtle: var(--color-amber-200);
40
45
  --infor-subtle: var(--color-blue-50);
41
46
  --infor-border: var(--color-blue-500);
42
47
  --infor-border-subtle: var(--color-blue-200);
43
- --infor-text: var(--color-blue-800);
44
48
  --ghost: var(--color-white-alpha-001);
45
49
  --ghost-foreground: var(--color-brand-neutrals-700);
46
50
  --ghost-hover: var(--color-black-alpha-5);
@@ -133,6 +137,9 @@
133
137
  --primary-brand-fg: var(--color-brand-shades-500);
134
138
  --inverse-fg: var(--color-white-alpha-100);
135
139
  --destructive: #9e4042;
140
+ --positive: var(--color-emerald-400);
141
+ --warning: var(--color-amber-400);
142
+ --infor: var(--color-blue-400);
136
143
  --destructive-inverse-fg: var(--color-white-alpha-100);
137
144
  --border-primary: var(--color-brand-neutrals-700);
138
145
  --border-secondary: var(--color-brand-neutrals-800);
@@ -143,19 +150,20 @@
143
150
  --primary-hover: var(--color-brand-neutrals-950);
144
151
  --secondary-hover: var(--color-brand-neutrals-900);
145
152
  --primary-brand-hover: var(--color-brand-shades-500);
153
+ --destructive-text: var(--color-red-400);
146
154
  --destructive-hover: var(--color-red-500);
147
155
  --destructive-subtle: var(--color-red-950);
148
156
  --destructive-border: var(--color-red-500);
149
157
  --destructive-border-subtle: var(--color-red-800);
150
- --destructive-text: var(--color-red-400);
151
- --warning-subtle: var(--color-yellow-950);
152
- --warning-border: var(--color-yellow-500);
153
- --warning-border-subtle: var(--color-yellow-800);
154
- --warning-text: var(--color-orange-300);
158
+ --positive-subtle: var(--color-emerald-950);
159
+ --positive-border: var(--color-emerald-500);
160
+ --positive-border-subtle: var(--color-emerald-800);
161
+ --warning-subtle: var(--color-amber-950);
162
+ --warning-border: var(--color-amber-500);
163
+ --warning-border-subtle: var(--color-amber-800);
155
164
  --infor-subtle: var(--color-blue-950);
156
165
  --infor-border: var(--color-blue-500);
157
166
  --infor-border-subtle: var(--color-blue-800);
158
- --infor-text: var(--color-blue-300);
159
167
  --ghost: var(--color-white-alpha-001);
160
168
  --ghost-foreground: var(--color-brand-neutrals-200);
161
169
  --ghost-hover: var(--color-black-alpha-10);
@@ -133,10 +133,10 @@
133
133
  --color-lime-950: #1a2e05;
134
134
 
135
135
  /* ========================= Emerald ========================= */
136
- --color-emerald-50: #ecfdf5;
137
- --color-emerald-100: #d1fae5;
138
- --color-emerald-200: #a7f3d0;
139
- --color-emerald-300: #6ee7b7;
136
+ --color-emerald-50: #f2fcf8;
137
+ --color-emerald-100: #d5f6e5;
138
+ --color-emerald-200: #afebcf;
139
+ --color-emerald-300: #76dfb5;
140
140
  --color-emerald-400: #34d399;
141
141
  --color-emerald-500: #10b981;
142
142
  --color-emerald-600: #059669;
@@ -8,6 +8,9 @@
8
8
  --shadow-lg: 0px 10px 15px -3px var(--color-black-alpha-10), 0px 4px 6px -4px var(--color-black-alpha-10);
9
9
  --shadow-xl: 0px 20px 25px -5px var(--color-black-alpha-10), 0px 8px 10px -6px var(--color-black-alpha-10);
10
10
  --shadow-2xl: 0px 25px 50px -12px var(--color-black-alpha-10);
11
+ --shadow-sonner: 0px 4px 12px 0px var(--color-black-alpha-10);
12
+ --shadow-fixed-column-left: 6px 0 6px -4px var(--color-black-alpha-10);
13
+ --shadow-fixed-column-right: -6px 0 6px -4px var(--color-black-alpha-10);
11
14
 
12
15
  --shadow-focus-ring: 0 0 0 3px var(--focus-ring);
13
16
  --shadow-focus-ring-error: 0 0 0 3px var(--focus-ring-error);