@licklist/design 0.78.45 → 0.78.47

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 (51) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -0
  4. package/dist/v2/components/Button/Button.d.ts +1 -1
  5. package/dist/v2/components/Button/Button.d.ts.map +1 -1
  6. package/dist/v2/components/Button/Button.scss.js +1 -1
  7. package/dist/v2/components/PeriodCard/PeriodCard.d.ts +66 -0
  8. package/dist/v2/components/PeriodCard/PeriodCard.d.ts.map +1 -0
  9. package/dist/v2/components/PeriodCard/PeriodCard.js +351 -0
  10. package/dist/v2/components/PeriodCard/PeriodCard.scss.js +6 -0
  11. package/dist/v2/components/PeriodCard/index.d.ts +3 -0
  12. package/dist/v2/components/PeriodCard/index.d.ts.map +1 -0
  13. package/dist/v2/components/ReorderRow/ReorderRow.d.ts +24 -0
  14. package/dist/v2/components/ReorderRow/ReorderRow.d.ts.map +1 -0
  15. package/dist/v2/components/ReorderRow/ReorderRow.js +109 -0
  16. package/dist/v2/components/ReorderRow/ReorderRow.scss.js +6 -0
  17. package/dist/v2/components/ReorderRow/index.d.ts +3 -0
  18. package/dist/v2/components/ReorderRow/index.d.ts.map +1 -0
  19. package/dist/v2/components/index.d.ts +4 -0
  20. package/dist/v2/components/index.d.ts.map +1 -1
  21. package/dist/v2/index.d.ts +6 -0
  22. package/dist/v2/index.d.ts.map +1 -1
  23. package/dist/v2/pages/DeleteEntity/DeleteEntityPage.d.ts +29 -0
  24. package/dist/v2/pages/DeleteEntity/DeleteEntityPage.d.ts.map +1 -0
  25. package/dist/v2/pages/DeleteEntity/DeleteEntityPage.js +294 -0
  26. package/dist/v2/pages/DeleteEntity/DeleteEntityPage.scss.js +6 -0
  27. package/dist/v2/pages/DeleteEntity/index.d.ts +3 -0
  28. package/dist/v2/pages/DeleteEntity/index.d.ts.map +1 -0
  29. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +2 -0
  30. package/dist/v2/pages/Settings/components/SidebarNavItem.js +2 -0
  31. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.js +47 -0
  32. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.scss.js +6 -0
  33. package/dist/v2/styles/components/Button.scss +27 -0
  34. package/package.json +1 -1
  35. package/src/index.ts +2 -0
  36. package/src/v2/components/Button/Button.tsx +1 -0
  37. package/src/v2/components/PeriodCard/PeriodCard.scss +157 -0
  38. package/src/v2/components/PeriodCard/PeriodCard.stories.tsx +245 -0
  39. package/src/v2/components/PeriodCard/PeriodCard.tsx +350 -0
  40. package/src/v2/components/PeriodCard/index.ts +8 -0
  41. package/src/v2/components/ReorderRow/ReorderRow.scss +68 -0
  42. package/src/v2/components/ReorderRow/ReorderRow.stories.tsx +124 -0
  43. package/src/v2/components/ReorderRow/ReorderRow.tsx +88 -0
  44. package/src/v2/components/ReorderRow/index.ts +2 -0
  45. package/src/v2/components/index.ts +6 -0
  46. package/src/v2/index.ts +13 -0
  47. package/src/v2/pages/DeleteEntity/DeleteEntityPage.scss +96 -0
  48. package/src/v2/pages/DeleteEntity/DeleteEntityPage.stories.tsx +83 -0
  49. package/src/v2/pages/DeleteEntity/DeleteEntityPage.tsx +120 -0
  50. package/src/v2/pages/DeleteEntity/index.ts +2 -0
  51. package/src/v2/styles/components/Button.scss +27 -0
package/src/index.ts CHANGED
@@ -51,4 +51,6 @@ export * from './v2/dashboard-analytics'
51
51
  export * from './v2/navigation/DashboardLayout'
52
52
  export * from './v2/pages/Settings'
53
53
  export * from './v2/pages/ZonesResources'
54
+ export * from './v2/pages/SettingsSubPage'
55
+ export * from './v2/pages/DeleteEntity'
54
56
  export * from './v2/components'
@@ -8,6 +8,7 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
8
8
  | 'secondary-soft'
9
9
  | 'tertiary-soft'
10
10
  | 'primary-outline'
11
+ | 'outline'
11
12
  | 'secondary'
12
13
  | 'destructive-soft'
13
14
  | 'destructive-strong'
@@ -0,0 +1,157 @@
1
+ .period-card {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 16px;
5
+ padding: 16px;
6
+ border-radius: 8px;
7
+ background: var(--surface-secondary, #f5f6fa);
8
+
9
+ &__title-row {
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: space-between;
13
+ }
14
+
15
+ &__title {
16
+ font-family: var(--font-family-sans);
17
+ font-size: 16px;
18
+ font-weight: 600;
19
+ color: var(--labels-main-label-primary, #121e52);
20
+ }
21
+
22
+ &__header {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ }
27
+
28
+ &__badge-group {
29
+ display: flex;
30
+ align-items: center;
31
+ gap: 8px;
32
+ color: var(--label-secondary, #6b7a99);
33
+ }
34
+
35
+ &__badge {
36
+ font-family: var(--font-family-sans);
37
+ font-size: 12px;
38
+ color: var(--label-secondary, #6b7a99);
39
+ border: 1px solid var(--border-primary, #e2e2e2);
40
+ border-radius: 999px;
41
+ padding: 2px 10px;
42
+ }
43
+
44
+ &__section {
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: 8px;
48
+ }
49
+
50
+ &__section-label {
51
+ font-family: var(--font-family-sans);
52
+ font-size: 14px;
53
+ font-weight: 600;
54
+ color: var(--labels-main-label-primary, #121e52);
55
+ }
56
+
57
+ &__row {
58
+ display: grid;
59
+ grid-template-columns: 1fr 1fr;
60
+ gap: 16px;
61
+
62
+ @media (max-width: 768px) {
63
+ grid-template-columns: 1fr;
64
+ gap: 12px;
65
+ }
66
+
67
+ &--time {
68
+ margin-top: 8px;
69
+ }
70
+ }
71
+
72
+ &__days-grid {
73
+ display: grid;
74
+ grid-template-columns: 1fr 1fr;
75
+ gap: 8px;
76
+ }
77
+
78
+ &__days-col {
79
+ display: flex;
80
+ flex-direction: column;
81
+ gap: 8px;
82
+ }
83
+
84
+ &__time-range {
85
+ display: grid;
86
+ grid-template-columns: 1fr auto 1fr;
87
+ align-items: end;
88
+ gap: 12px;
89
+
90
+ @media (max-width: 768px) {
91
+ grid-template-columns: 1fr;
92
+ gap: 8px;
93
+ }
94
+ }
95
+
96
+ &__time-separator {
97
+ font-family: var(--font-family-sans, 'Geist', sans-serif);
98
+ font-size: 14px;
99
+ color: var(--label-secondary, #6b7a99);
100
+ padding-bottom: 10px;
101
+ }
102
+ }
103
+
104
+ // Small square checkboxes for day selection
105
+ .day-checkbox {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 6px;
109
+ cursor: pointer;
110
+ user-select: none;
111
+
112
+ &__input {
113
+ position: absolute;
114
+ opacity: 0;
115
+ width: 0;
116
+ height: 0;
117
+ }
118
+
119
+ &__box {
120
+ width: 16px;
121
+ height: 16px;
122
+ min-width: 16px;
123
+ border: 1px solid var(--border-primary, #e2e2e2);
124
+ border-radius: 3px;
125
+ background: var(--surface-primary, #fff);
126
+ transition: all 0.15s ease;
127
+ position: relative;
128
+
129
+ &::after {
130
+ content: '';
131
+ position: absolute;
132
+ top: 1px;
133
+ left: 4.5px;
134
+ width: 5px;
135
+ height: 9px;
136
+ border: solid white;
137
+ border-width: 0 2px 2px 0;
138
+ transform: rotate(45deg);
139
+ opacity: 0;
140
+ }
141
+ }
142
+
143
+ &__input:checked + &__box {
144
+ background: var(--fill-selected, #14215a);
145
+ border-color: var(--fill-selected, #14215a);
146
+
147
+ &::after {
148
+ opacity: 1;
149
+ }
150
+ }
151
+
152
+ &__label {
153
+ font-family: var(--font-family-sans, 'Geist', sans-serif);
154
+ font-size: 14px;
155
+ color: var(--label-primary, #121e52);
156
+ }
157
+ }
@@ -0,0 +1,245 @@
1
+ import React, { useState } from 'react'
2
+ import { Meta, StoryObj } from '@storybook/react'
3
+ import { PeriodCard, PeriodCardSection, PeriodCardTimeRange } from './PeriodCard'
4
+ import { NewInput } from '../NewInput'
5
+ import { IconButton } from '../IconButton'
6
+ import type { PeriodCardValue } from './PeriodCard'
7
+
8
+ export default {
9
+ title: 'v2/Components/PeriodCard',
10
+ component: PeriodCard,
11
+ parameters: {
12
+ layout: 'padded',
13
+ },
14
+ } as Meta<typeof PeriodCard>
15
+
16
+ type Story = StoryObj<typeof PeriodCard>
17
+
18
+ const defaultValue: PeriodCardValue = {
19
+ days: [],
20
+ is24Hours: true,
21
+ maxCapacity: 1,
22
+ minCapacity: null,
23
+ }
24
+
25
+ export const Default: Story = {
26
+ args: {
27
+ value: defaultValue,
28
+ onChange: () => {},
29
+ onDelete: () => alert('Delete period'),
30
+ },
31
+ }
32
+
33
+ export const WithDaysSelected: Story = {
34
+ args: {
35
+ value: {
36
+ days: ['Monday', 'Wednesday', 'Friday'],
37
+ is24Hours: true,
38
+ maxCapacity: 5,
39
+ minCapacity: 2,
40
+ },
41
+ onChange: () => {},
42
+ onDelete: () => alert('Delete period'),
43
+ },
44
+ }
45
+
46
+ export const WithCustomTime: Story = {
47
+ args: {
48
+ value: {
49
+ days: ['Saturday', 'Sunday'],
50
+ is24Hours: false,
51
+ startTime: '10:00',
52
+ endTime: '18:00',
53
+ maxCapacity: 10,
54
+ minCapacity: null,
55
+ },
56
+ onChange: () => {},
57
+ onDelete: () => alert('Delete period'),
58
+ },
59
+ }
60
+
61
+ export const WithoutDelete: Story = {
62
+ args: {
63
+ value: defaultValue,
64
+ onChange: () => {},
65
+ },
66
+ }
67
+
68
+ export const DaysAndTimeOnly: Story = {
69
+ args: {
70
+ value: {
71
+ days: ['Monday', 'Tuesday'],
72
+ is24Hours: false,
73
+ startTime: '08:00',
74
+ endTime: '16:00',
75
+ maxCapacity: 1,
76
+ minCapacity: null,
77
+ },
78
+ onChange: () => {},
79
+ onDelete: () => alert('Delete'),
80
+ hideCapacity: true,
81
+ labels: {
82
+ badge: 'Availability',
83
+ },
84
+ },
85
+ }
86
+
87
+ export const CapacityOnly: Story = {
88
+ args: {
89
+ value: {
90
+ days: [],
91
+ is24Hours: true,
92
+ maxCapacity: 20,
93
+ minCapacity: 5,
94
+ },
95
+ onChange: () => {},
96
+ onDelete: () => alert('Delete'),
97
+ hideDays: true,
98
+ hideTime: true,
99
+ labels: {
100
+ badge: 'Capacity Limit',
101
+ sectionTitle: 'Capacity Range',
102
+ minValue: 'Min Capacity',
103
+ maxValue: 'Max Capacity',
104
+ },
105
+ },
106
+ }
107
+
108
+ export const CustomLabels: Story = {
109
+ args: {
110
+ value: {
111
+ days: ['Monday', 'Tuesday'],
112
+ is24Hours: true,
113
+ maxCapacity: 3,
114
+ minCapacity: 1,
115
+ },
116
+ onChange: () => {},
117
+ onDelete: () => alert('Delete'),
118
+ labels: {
119
+ badge: 'Capacity Period',
120
+ sectionTitle: 'Capacity Override',
121
+ minValue: 'Min Capacity',
122
+ maxValue: 'Max Capacity',
123
+ days: 'Available Days',
124
+ time: 'Time Settings',
125
+ alignToggle: 'Use venue opening hours',
126
+ },
127
+ },
128
+ }
129
+
130
+ const InteractiveTemplate = () => {
131
+ const [periods, setPeriods] = useState<PeriodCardValue[]>([
132
+ { days: [], is24Hours: true, maxCapacity: 1, minCapacity: null },
133
+ ])
134
+
135
+ const addPeriod = () => {
136
+ setPeriods([
137
+ ...periods,
138
+ { days: [], is24Hours: true, maxCapacity: 1, minCapacity: null },
139
+ ])
140
+ }
141
+
142
+ const removePeriod = (index: number) => {
143
+ setPeriods(periods.filter((_, i) => i !== index))
144
+ }
145
+
146
+ const updatePeriod = (index: number, updated: PeriodCardValue) => {
147
+ setPeriods(periods.map((p, i) => (i === index ? updated : p)))
148
+ }
149
+
150
+ return (
151
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '12px', maxWidth: 600 }}>
152
+ {periods.map((period, index) => (
153
+ <PeriodCard
154
+ key={index}
155
+ value={period}
156
+ onChange={(updated) => updatePeriod(index, updated)}
157
+ onDelete={() => removePeriod(index)}
158
+ labels={{
159
+ badge: 'Capacity Period',
160
+ sectionTitle: 'Capacity Override',
161
+ minValue: 'Min Capacity',
162
+ maxValue: 'Max Capacity',
163
+ }}
164
+ />
165
+ ))}
166
+ <button
167
+ type="button"
168
+ onClick={addPeriod}
169
+ style={{
170
+ padding: '8px 16px',
171
+ border: '1px dashed #ccc',
172
+ borderRadius: 8,
173
+ background: 'none',
174
+ cursor: 'pointer',
175
+ }}
176
+ >
177
+ + Add Period
178
+ </button>
179
+ </div>
180
+ )
181
+ }
182
+
183
+ export const Interactive: Story = {
184
+ render: () => <InteractiveTemplate />,
185
+ }
186
+
187
+ // ── Session Period (children mode) ──
188
+
189
+ const SessionPeriodTemplate = () => {
190
+ const [periods, setPeriods] = useState([
191
+ { interval: 15, startTime: '09:00', endTime: '17:00' },
192
+ ])
193
+
194
+ const addPeriod = () => {
195
+ setPeriods([...periods, { interval: 15, startTime: '09:00', endTime: '17:00' }])
196
+ }
197
+
198
+ const removePeriod = (index: number) => {
199
+ setPeriods(periods.filter((_, i) => i !== index))
200
+ }
201
+
202
+ const updatePeriod = (index: number, updates: Partial<typeof periods[0]>) => {
203
+ setPeriods(periods.map((p, i) => (i === index ? { ...p, ...updates } : p)))
204
+ }
205
+
206
+ return (
207
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '12px', maxWidth: 600 }}>
208
+ {periods.map((period, index) => (
209
+ <PeriodCard
210
+ key={index}
211
+ title={`Period ${index + 1}`}
212
+ onDelete={periods.length > 1 ? () => removePeriod(index) : undefined}
213
+ >
214
+ <PeriodCardSection label="Sessions every">
215
+ <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
216
+ <NewInput
217
+ type="number"
218
+ min={1}
219
+ value={period.interval}
220
+ onChange={(e) =>
221
+ updatePeriod(index, {
222
+ interval: parseInt((e.target as HTMLInputElement).value) || 0,
223
+ })
224
+ }
225
+ style={{ width: 80 }}
226
+ />
227
+ <span style={{ fontSize: 14, color: '#6b7a99' }}>minutes</span>
228
+ </div>
229
+ </PeriodCardSection>
230
+ <PeriodCardTimeRange
231
+ startTime={period.startTime}
232
+ endTime={period.endTime}
233
+ onStartTimeChange={(v) => updatePeriod(index, { startTime: v })}
234
+ onEndTimeChange={(v) => updatePeriod(index, { endTime: v })}
235
+ />
236
+ </PeriodCard>
237
+ ))}
238
+ <IconButton label="Add Time Period" icon="add" onClick={addPeriod} />
239
+ </div>
240
+ )
241
+ }
242
+
243
+ export const SessionPeriod: Story = {
244
+ render: () => <SessionPeriodTemplate />,
245
+ }