@licklist/design 0.78.33 → 0.78.35

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 (43) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/provider/location-input/LocationInput.js +1 -1
  3. package/dist/v2/components/ActionMenu/ActionMenu.scss.js +1 -1
  4. package/dist/v2/components/Alert/Alert.d.ts.map +1 -1
  5. package/dist/v2/components/Alert/Alert.js +48 -1
  6. package/dist/v2/components/Alert/Alert.scss.js +1 -1
  7. package/dist/v2/components/Badge/Badge.d.ts +1 -0
  8. package/dist/v2/components/Badge/Badge.d.ts.map +1 -1
  9. package/dist/v2/components/Badge/Badge.js +2 -1
  10. package/dist/v2/components/Badge/Badge.scss.js +1 -1
  11. package/dist/v2/components/Checkbox/Checkbox.scss.js +1 -1
  12. package/dist/v2/components/FormField/FormField.scss.js +1 -1
  13. package/dist/v2/components/NPSScore/NPSScore.d.ts +3 -1
  14. package/dist/v2/components/NPSScore/NPSScore.d.ts.map +1 -1
  15. package/dist/v2/components/NPSScore/NPSScore.js +11 -27
  16. package/dist/v2/components/NPSScore/NPSScore.scss.js +1 -1
  17. package/dist/v2/components/QuickFilter/QuickFilter.scss.js +1 -1
  18. package/dist/v2/components/TableSortIcon/TableSortIcon.d.ts.map +1 -1
  19. package/dist/v2/components/TableSortIcon/TableSortIcon.js +5 -3
  20. package/dist/v2/components/WYSIWYGEditor/WYSIWYGEditor.scss.js +1 -1
  21. package/dist/v2/components/index.d.ts +1 -1
  22. package/dist/v2/components/index.d.ts.map +1 -1
  23. package/dist/v2/icons/index.d.ts +36 -2
  24. package/dist/v2/icons/index.d.ts.map +1 -1
  25. package/dist/v2/icons/index.js +41 -29
  26. package/dist/v2/pages/Settings/SettingsPage.scss.js +1 -1
  27. package/dist/v2/pages/Settings/SettingsTabs.scss.js +1 -1
  28. package/dist/v2/pages/Settings/components/SidebarCustomisation.scss.js +1 -1
  29. package/dist/v2/pages/Settings/components/SidebarNavItem.scss.js +1 -1
  30. package/package.json +3 -3
  31. package/src/provider/location-input/LocationInput.tsx +1 -1
  32. package/src/v2/components/Alert/Alert.scss +8 -19
  33. package/src/v2/components/Alert/Alert.tsx +24 -1
  34. package/src/v2/components/Badge/Badge.scss +25 -23
  35. package/src/v2/components/Badge/Badge.tsx +3 -0
  36. package/src/v2/components/Customer/CustomersList.scss +60 -9
  37. package/src/v2/components/NPSScore/NPSScore.scss +40 -59
  38. package/src/v2/components/NPSScore/NPSScore.tsx +15 -16
  39. package/src/v2/components/QuickFilter/QuickFilter.scss +14 -3
  40. package/src/v2/components/TableSortIcon/TableSortIcon.tsx +3 -5
  41. package/src/v2/components/index.ts +2 -0
  42. package/src/v2/icons/index.tsx +147 -14
  43. package/src/v2/styles/tokens/_colors.scss +6 -0
@@ -54,6 +54,7 @@
54
54
  width: 30px;
55
55
  height: 30px;
56
56
  flex-shrink: 0;
57
+ fill: var(--shade-lighter);
57
58
  }
58
59
  }
59
60
 
@@ -111,6 +112,10 @@
111
112
 
112
113
  .search-input-wrapper {
113
114
  width: 70%;
115
+
116
+ .new-form-input__icon {
117
+ color: var(--shade-lighter);
118
+ }
114
119
  }
115
120
 
116
121
  .search-helper-text {
@@ -125,13 +130,21 @@
125
130
 
126
131
  .filters-actions-row {
127
132
  display: flex;
128
- justify-content: space-between;
129
- align-items: center;
130
- gap: 24px;
133
+ flex-direction: column;
134
+ align-items: flex-start;
135
+ gap: 16px;
131
136
  width: 100%;
137
+
138
+ @media (min-width: 1024px) {
139
+ flex-direction: row;
140
+ justify-content: space-between;
141
+ align-items: center;
142
+ gap: 24px;
143
+ }
132
144
  }
133
145
 
134
146
  .quick-filters-wrapper {
147
+ width: 100%;
135
148
  flex: 1;
136
149
  }
137
150
 
@@ -139,6 +152,12 @@
139
152
  display: flex;
140
153
  gap: 12px;
141
154
  align-items: center;
155
+
156
+ .ghost-button {
157
+ &__icon svg {
158
+ fill: var(--shade-lighter);
159
+ }
160
+ }
142
161
  }
143
162
 
144
163
  &__row {
@@ -165,19 +184,46 @@
165
184
  &__sub {
166
185
  font-size: 13px;
167
186
  color: #9399B3;
187
+ display: block !important;
168
188
  }
169
189
  &__id {
170
190
  font-size: 13px;
171
191
  color: #9399B3;
172
- display: none;
192
+ display: none !important;
173
193
  }
174
194
 
175
195
  &:hover {
176
196
  .entity-cell__id {
177
- display: block;
197
+ display: block !important;
178
198
  }
179
199
  .entity-cell__sub {
180
- display: none;
200
+ display: none !important;
201
+ }
202
+ }
203
+
204
+ // Ensure hover state on the row also triggers the same behavior
205
+ // This addresses potential flickering when moving between cells
206
+ :is(.new-table__row:hover) & {
207
+ .entity-cell__id {
208
+ display: block !important;
209
+ }
210
+ .entity-cell__sub {
211
+ display: none !important;
212
+ }
213
+ }
214
+
215
+ // When entity-cell__sub is missing (like in template list),
216
+ // showing entity-cell__id on hover causes height jump.
217
+ // We only want to swap if both exist, or ensure height is stable.
218
+ &:not(:has(.entity-cell__sub)) {
219
+ .entity-cell__id {
220
+ display: block !important;
221
+ }
222
+ }
223
+
224
+ :is(.new-table__row:hover) &:not(:has(.entity-cell__sub)) {
225
+ .entity-cell__id {
226
+ display: block !important;
181
227
  }
182
228
  }
183
229
  }
@@ -542,6 +588,7 @@
542
588
  "customer bookings"
543
589
  "divider divider"
544
590
  "next last"
591
+ "status status"
545
592
  "actions actions";
546
593
  grid-template-columns: 1fr auto;
547
594
  border: 1px solid var(--border-primary, #E8E9EF);
@@ -604,6 +651,10 @@
604
651
  grid-area: last; // Reuse 'last' area for waiver in waiver list
605
652
  text-align: right;
606
653
  }
654
+ &.waiver-col-mb {
655
+ grid-area: status;
656
+ text-align: left;
657
+ }
607
658
  }
608
659
  }
609
660
  }
@@ -679,7 +730,7 @@
679
730
  .waiver-cell {
680
731
  display: flex;
681
732
  flex-direction: column;
682
- align-items: flex-end;
733
+ align-items: flex-start;
683
734
  min-width: 0;
684
735
  overflow: hidden;
685
736
 
@@ -688,7 +739,7 @@
688
739
  color: #626A90;
689
740
  font-weight: 500;
690
741
  margin-bottom: 4px;
691
- text-align: right;
742
+ text-align: left;
692
743
  white-space: nowrap;
693
744
  overflow: hidden;
694
745
  text-overflow: ellipsis;
@@ -697,7 +748,7 @@
697
748
 
698
749
  .v2-badge {
699
750
  display: inline-flex;
700
- margin-left: auto;
751
+ margin-right: auto;
701
752
  }
702
753
  }
703
754
 
@@ -1,12 +1,18 @@
1
1
  .nps-score {
2
2
  width: 100%;
3
3
  margin-top: 24px;
4
+ padding: 0 1rem;
5
+ box-sizing: border-box;
6
+
7
+ @media (max-width: 576px) {
8
+ padding: 0 16px;
9
+ }
4
10
 
5
11
  &__container {
6
- background: var(--surfaces-main-surface-secondary, #F4F4F7);
12
+ background: var(--surface-secondary);
7
13
  border-radius: 16px;
8
14
  padding: 24px;
9
- border: 1px solid var(--borders-main-border-primary, #E8E9EF);
15
+ border: 1px solid var(--border-primary);
10
16
  }
11
17
 
12
18
  &__question {
@@ -14,7 +20,7 @@
14
20
  font-size: 18px;
15
21
  font-weight: 600;
16
22
  line-height: 24px;
17
- color: var(--labels-main-label-primary, #121E52);
23
+ color: var(--label-primary);
18
24
  margin: 0 0 16px 0;
19
25
  }
20
26
 
@@ -34,7 +40,7 @@
34
40
  font-family: var(--font-family-sans);
35
41
  font-size: 14px;
36
42
  font-weight: 500;
37
- color: var(--labels-main-label-secondary, #626A90);
43
+ color: var(--label-secondary);
38
44
  }
39
45
 
40
46
  &--desktop {
@@ -57,7 +63,7 @@
57
63
  }
58
64
 
59
65
  &__label-icon {
60
- color: var(--fills-main-fill-secondary, #626A90);
66
+ color: var(--fill-secondary);
61
67
  flex-shrink: 0;
62
68
  }
63
69
 
@@ -79,18 +85,18 @@
79
85
  font-weight: 600;
80
86
  transition: all 0.2s ease;
81
87
  cursor: pointer;
82
- background: var(--surfaces-main-surface-primary, #FFFFFF);
83
- border: 1px solid var(--borders-main-border-primary, #E8E9EF);
84
- color: var(--labels-main-label-primary, #121E52);
88
+ background: var(--surface-primary);
89
+ border: 1px solid var(--border-primary);
90
+ color: var(--label-primary);
85
91
 
86
92
  &:hover:not(&--selected) {
87
- background: var(--surfaces-main-surface-primary-hover, #F8F8FA);
93
+ background: var(--surface-primary-hover);
88
94
  }
89
95
 
90
96
  &--selected {
91
- background: var(--fills-main-fill-primary, #14215A);
97
+ background: var(--fill-primary);
92
98
  border-color: transparent;
93
- color: #FFFFFF;
99
+ color: var(--label-primary-alt);
94
100
  }
95
101
  }
96
102
 
@@ -113,7 +119,7 @@
113
119
  font-family: var(--font-family-sans);
114
120
  font-size: 14px;
115
121
  font-weight: 500;
116
- color: var(--labels-main-label-primary, #121E52);
122
+ color: var(--label-primary);
117
123
  margin-bottom: 8px;
118
124
  }
119
125
 
@@ -127,7 +133,7 @@
127
133
  &__optional {
128
134
  font-family: var(--font-family-sans);
129
135
  font-size: 14px;
130
- color: var(--labels-main-label-secondary, #626A90);
136
+ color: var(--label-secondary);
131
137
  }
132
138
 
133
139
  &__textarea {
@@ -135,39 +141,39 @@
135
141
  min-height: 100px;
136
142
  padding: 12px;
137
143
  border-radius: 8px;
138
- border: 1px solid var(--borders-main-border-primary, #E8E9EF);
139
- background: var(--surfaces-main-surface-primary, #FFFFFF);
144
+ border: 1px solid var(--border-primary);
145
+ background: var(--surface-primary);
140
146
  font-family: var(--font-family-sans);
141
147
  font-size: 14px;
142
- color: var(--labels-main-label-primary, #121E52);
148
+ color: var(--label-primary);
143
149
  resize: vertical;
144
150
  box-sizing: border-box;
145
151
 
146
152
  &::placeholder {
147
- color: var(--labels-main-label-tertiary, #9CA3AF);
153
+ color: var(--label-secondary);
148
154
  }
149
155
 
150
156
  &:focus {
151
157
  outline: none;
152
- border-color: var(--fills-main-fill-primary, #14215A);
158
+ border-color: var(--fill-primary);
153
159
  }
154
160
 
155
161
  &--error {
156
- border-color: var(--fills-main-fill-danger, #DC2626);
162
+ border-color: var(--fill-danger);
157
163
  }
158
164
  }
159
165
 
160
166
  &__hint {
161
167
  font-family: var(--font-family-sans);
162
168
  font-size: 14px;
163
- color: var(--labels-main-label-secondary, #626A90);
169
+ color: var(--label-secondary);
164
170
  margin: 4px 0 0 0;
165
171
  }
166
172
 
167
173
  &__error {
168
174
  font-family: var(--font-family-sans);
169
175
  font-size: 14px;
170
- color: var(--fills-main-fill-danger, #DC2626);
176
+ color: var(--fill-danger);
171
177
  margin: 4px 0 0 0;
172
178
  }
173
179
 
@@ -175,7 +181,7 @@
175
181
  font-family: var(--font-family-sans);
176
182
  font-size: 14px;
177
183
  font-weight: 500;
178
- color: var(--labels-main-label-action, #2563EB);
184
+ color: var(--label-action);
179
185
  text-decoration: underline;
180
186
  background: none;
181
187
  border: none;
@@ -184,17 +190,18 @@
184
190
  transition: color 0.2s ease;
185
191
 
186
192
  &:hover {
187
- color: var(--labels-main-label-action-hover, #1D4ED8);
193
+ color: var(--label-action);
188
194
  }
189
195
  }
190
196
 
191
197
  &__roles {
192
198
  display: grid;
193
199
  grid-template-columns: 1fr;
194
- gap: 12px;
200
+ gap: 8px;
195
201
 
196
202
  @media (min-width: 640px) {
197
203
  grid-template-columns: repeat(2, 1fr);
204
+ gap: 4px;
198
205
  }
199
206
 
200
207
  @media (min-width: 1024px) {
@@ -217,8 +224,8 @@
217
224
  width: 20px;
218
225
  height: 20px;
219
226
  border-radius: 50%;
220
- border: 2px solid var(--borders-main-border-primary, #E8E9EF);
221
- background: var(--surfaces-main-surface-primary, #FFFFFF);
227
+ border: 2px solid var(--border-primary);
228
+ background: var(--surface-primary);
222
229
  margin: 0;
223
230
  cursor: pointer;
224
231
  flex-shrink: 0;
@@ -234,12 +241,12 @@
234
241
  width: 10px;
235
242
  height: 10px;
236
243
  border-radius: 50%;
237
- background: var(--fills-main-fill-primary, #14215A);
244
+ background: var(--fill-primary);
238
245
  transition: transform 0.2s ease;
239
246
  }
240
247
 
241
248
  &:checked {
242
- border-color: var(--fills-main-fill-primary, #14215A);
249
+ border-color: var(--fill-primary);
243
250
 
244
251
  &::before {
245
252
  transform: translate(-50%, -50%) scale(1);
@@ -248,7 +255,7 @@
248
255
 
249
256
  &:focus {
250
257
  outline: none;
251
- box-shadow: 0 0 0 2px var(--fills-main-fill-primary-opacity, rgba(20, 33, 90, 0.2));
258
+ box-shadow: 0 0 0 2px var(--border-action);
252
259
  }
253
260
  }
254
261
 
@@ -259,33 +266,7 @@
259
266
  &__role-label {
260
267
  font-family: var(--font-family-sans);
261
268
  font-size: 14px;
262
- color: var(--labels-main-label-primary, #121E52);
263
- }
264
-
265
- &__submit {
266
- display: inline-flex;
267
- align-items: center;
268
- justify-content: center;
269
- padding: 12px 24px;
270
- border-radius: 8px;
271
- border: none;
272
- background: var(--fills-main-fill-primary, #14215A);
273
- color: #FFFFFF;
274
- font-family: var(--font-family-sans);
275
- font-size: 14px;
276
- font-weight: 600;
277
- cursor: pointer;
278
- transition: background 0.2s ease;
279
- width: fit-content;
280
-
281
- &:hover:not(:disabled) {
282
- background: var(--fills-main-fill-primary-hover, #1a2a6e);
283
- }
284
-
285
- &:disabled {
286
- opacity: 0.6;
287
- cursor: not-allowed;
288
- }
269
+ color: var(--label-primary);
289
270
  }
290
271
 
291
272
  &__success {
@@ -298,7 +279,7 @@
298
279
  }
299
280
 
300
281
  &__success-icon {
301
- color: var(--fills-main-fill-success, #10B981);
282
+ color: var(--fill-status-success);
302
283
  margin-bottom: 16px;
303
284
  }
304
285
 
@@ -306,14 +287,14 @@
306
287
  font-family: var(--font-family-sans);
307
288
  font-size: 24px;
308
289
  font-weight: 600;
309
- color: var(--labels-main-label-primary, #121E52);
290
+ color: var(--label-primary);
310
291
  margin: 0 0 8px 0;
311
292
  }
312
293
 
313
294
  &__success-message {
314
295
  font-family: var(--font-family-sans);
315
296
  font-size: 14px;
316
- color: var(--labels-main-label-secondary, #626A90);
297
+ color: var(--label-secondary);
317
298
  margin: 0;
318
299
  }
319
300
  }
@@ -1,13 +1,17 @@
1
1
  import React, { useState } from 'react'
2
2
  import './NPSScore.scss'
3
+ import { Button } from '../Button'
4
+ import { Alert } from '../Alert'
3
5
 
4
6
  export interface NPSScoreProps {
5
7
  /** User's first name for personalized greeting */
6
8
  firstName?: string
7
9
  /** Callback when NPS is submitted */
8
10
  onSubmit?: (data: NPSSubmitData) => void
9
- /** Callback when dismissed */
11
+ /** Callback when dismissed without submitting */
10
12
  onDismiss?: () => void
13
+ /** Callback when success alert is dismissed after submission */
14
+ onSubmitDismiss?: () => void
11
15
  }
12
16
 
13
17
  export interface NPSSubmitData {
@@ -42,6 +46,7 @@ export const NPSScore: React.FC<NPSScoreProps> = ({
42
46
  firstName,
43
47
  onSubmit,
44
48
  onDismiss,
49
+ onSubmitDismiss,
45
50
  }) => {
46
51
  const [selectedScore, setSelectedScore] = useState<number | null>(null)
47
52
  const [reason, setReason] = useState('')
@@ -54,11 +59,7 @@ export const NPSScore: React.FC<NPSScoreProps> = ({
54
59
  const handleSubmit = async () => {
55
60
  if (!selectedScore) return
56
61
 
57
- // Validate required fields - reason required for all scores
58
62
  const newErrors: { reason?: string; role?: string } = {}
59
- if (!reason.trim()) {
60
- newErrors.reason = 'Please provide a reason for your score'
61
- }
62
63
  if (!role) {
63
64
  newErrors.role = 'Please select your role'
64
65
  }
@@ -86,13 +87,12 @@ export const NPSScore: React.FC<NPSScoreProps> = ({
86
87
  if (isSubmitted) {
87
88
  return (
88
89
  <div className="nps-score">
89
- <div className="nps-score__container">
90
- <div className="nps-score__success">
91
- <IconBigSmile size={48} className="nps-score__success-icon" />
92
- <h3 className="nps-score__success-title">Thank you!</h3>
93
- <p className="nps-score__success-message">Your feedback has been submitted successfully.</p>
94
- </div>
95
- </div>
90
+ <Alert
91
+ variant="success"
92
+ title="Thank you!"
93
+ message="Your feedback has been submitted successfully."
94
+ onDismiss={onSubmitDismiss}
95
+ />
96
96
  </div>
97
97
  )
98
98
  }
@@ -142,7 +142,7 @@ export const NPSScore: React.FC<NPSScoreProps> = ({
142
142
  {/* Reason textarea - always visible */}
143
143
  <div className="nps-score__field">
144
144
  <label className="nps-score__field-label">
145
- Reason for this score?
145
+ Reason for this score? (Optional)
146
146
  </label>
147
147
  <textarea
148
148
  value={reason}
@@ -192,13 +192,12 @@ export const NPSScore: React.FC<NPSScoreProps> = ({
192
192
  </div>
193
193
 
194
194
  {/* Submit button */}
195
- <button
195
+ <Button
196
196
  onClick={handleSubmit}
197
197
  disabled={isSubmitting}
198
- className="nps-score__submit"
199
198
  >
200
199
  {isSubmitting ? 'Submitting...' : 'Submit'}
201
- </button>
200
+ </Button>
202
201
  </div>
203
202
  )}
204
203
  </div>
@@ -12,11 +12,21 @@
12
12
 
13
13
  &__options {
14
14
  display: flex;
15
- flex-wrap: wrap;
15
+ flex-wrap: nowrap;
16
+ overflow-x: auto;
16
17
  gap: 8px;
18
+ -ms-overflow-style: none; /* IE and Edge */
19
+ scrollbar-width: none; /* Firefox */
20
+ padding-bottom: 2px; /* Prevent button shadows/borders from being cut off during scroll if any */
21
+
22
+ &::-webkit-scrollbar {
23
+ display: none; /* Chrome, Safari and Opera */
24
+ }
17
25
 
18
26
  .ghost-button {
19
27
  border-radius: 100px;
28
+ font-family: var(--font-family-mono, 'Geist Mono', monospace);
29
+ flex-shrink: 0;
20
30
  }
21
31
  }
22
32
  }
@@ -26,7 +36,7 @@
26
36
  .quick-filter {
27
37
  display: flex;
28
38
  flex-direction: row;
29
- align-items: flex-start;
39
+ align-items: center;
30
40
  gap: 12px;
31
41
  width: 100%;
32
42
 
@@ -37,7 +47,8 @@
37
47
  &__options {
38
48
  flex: 1;
39
49
  display: flex;
40
- flex-wrap: wrap;
50
+ flex-wrap: nowrap;
51
+ overflow-x: auto;
41
52
  gap: 6px;
42
53
  padding: 0;
43
54
  margin: 0;
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { ArrowUpIcon, ArrowDownIcon } from '../../icons'
2
+ import { TableHeaderArrowUpIcon, TableHeaderArrowDownIcon} from '../../icons'
3
3
 
4
4
  export type SortDirection = 'asc' | 'desc' | null
5
5
 
@@ -10,11 +10,9 @@ export interface TableSortIconProps {
10
10
  }
11
11
 
12
12
  export const TableSortIcon: React.FC<TableSortIconProps> = ({ active = false, direction, className = '' }) => {
13
- if (!active || !direction) return null
14
-
15
13
  return (
16
- <span className={className}>
17
- {direction === 'asc' ? <ArrowUpIcon /> : <ArrowDownIcon />}
14
+ <span className={className} style={{ visibility: active && direction ? 'visible' : 'hidden' }}>
15
+ {direction === 'asc' ? <TableHeaderArrowUpIcon /> : <TableHeaderArrowDownIcon />}
18
16
  </span>
19
17
  )
20
18
  }
@@ -61,6 +61,8 @@ export type { PaginationProps } from './Pagination'
61
61
  // Icons
62
62
  export {
63
63
  InfoIcon,
64
+ TableHeaderArrowUpIcon,
65
+ TableHeaderArrowDownIcon,
64
66
  ArrowUpIcon,
65
67
  ArrowDownIcon,
66
68
  EditIcon,