@licklist/design 0.78.5-dev.111 → 0.78.5-dev.112

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 (80) hide show
  1. package/dist/index.js +2 -0
  2. package/dist/v2/components/AccountManagerCard/AccountManagerCard.scss.js +1 -1
  3. package/dist/v2/components/ActionMenu/ActionMenu.scss.js +1 -1
  4. package/dist/v2/components/Alert/Alert.scss.js +1 -1
  5. package/dist/v2/components/AvatarUpload/AvatarUpload.scss.js +1 -1
  6. package/dist/v2/components/Badge/Badge.scss.js +1 -1
  7. package/dist/v2/components/Checkbox/Checkbox.d.ts.map +1 -1
  8. package/dist/v2/components/Checkbox/Checkbox.js +10 -50
  9. package/dist/v2/components/Checkbox/Checkbox.scss.js +1 -1
  10. package/dist/v2/components/ColorPicker/ColorPicker.d.ts +15 -0
  11. package/dist/v2/components/ColorPicker/ColorPicker.d.ts.map +1 -0
  12. package/dist/v2/components/ColorPicker/ColorPicker.js +40 -0
  13. package/dist/v2/components/ColorPicker/ColorPicker.scss.js +6 -0
  14. package/dist/v2/components/ColorPicker/index.d.ts +2 -0
  15. package/dist/v2/components/ColorPicker/index.d.ts.map +1 -0
  16. package/dist/v2/components/DataTable/DataTable.scss.js +1 -1
  17. package/dist/v2/components/EmptyState/EmptyState.scss.js +1 -1
  18. package/dist/v2/components/FeatureCard/FeatureCard.d.ts +11 -0
  19. package/dist/v2/components/FeatureCard/FeatureCard.d.ts.map +1 -0
  20. package/dist/v2/components/FeatureCard/FeatureCard.js +40 -0
  21. package/dist/v2/components/FeatureCard/FeatureCard.scss.js +6 -0
  22. package/dist/v2/components/FeatureCard/index.d.ts +3 -0
  23. package/dist/v2/components/FeatureCard/index.d.ts.map +1 -0
  24. package/dist/v2/components/FeatureToggle/FeatureToggle.scss.js +1 -1
  25. package/dist/v2/components/FormField/FormField.scss.js +1 -1
  26. package/dist/v2/components/IconButton/IconButton.d.ts +5 -1
  27. package/dist/v2/components/IconButton/IconButton.d.ts.map +1 -1
  28. package/dist/v2/components/IconButton/IconButton.js +28 -3
  29. package/dist/v2/components/IconButton/IconButton.scss.js +1 -1
  30. package/dist/v2/components/InfoGrid/InfoGrid.scss.js +1 -1
  31. package/dist/v2/components/NotificationBanner/NotificationBanner.scss.js +1 -1
  32. package/dist/v2/components/PeriodCard/PeriodCard.d.ts +18 -4
  33. package/dist/v2/components/PeriodCard/PeriodCard.d.ts.map +1 -1
  34. package/dist/v2/components/PeriodCard/PeriodCard.js +46 -6
  35. package/dist/v2/components/StatusBadge/StatusBadge.scss.js +1 -1
  36. package/dist/v2/components/TableControls/TableControls.scss.js +1 -1
  37. package/dist/v2/components/Tabs/Tabs.scss.js +1 -1
  38. package/dist/v2/components/WYSIWYGEditor/WYSIWYGEditor.scss.js +1 -1
  39. package/dist/v2/components/index.d.ts +4 -0
  40. package/dist/v2/components/index.d.ts.map +1 -1
  41. package/dist/v2/icons/index.d.ts +19 -2
  42. package/dist/v2/icons/index.d.ts.map +1 -1
  43. package/dist/v2/icons/index.js +21 -4
  44. package/dist/v2/pages/Settings/SettingsPage.scss.js +1 -1
  45. package/dist/v2/pages/Settings/SettingsTabs.scss.js +1 -1
  46. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +2 -0
  47. package/dist/v2/pages/Settings/components/SidebarCustomisation.scss.js +1 -1
  48. package/dist/v2/pages/Settings/components/SidebarNavItem.js +2 -0
  49. package/dist/v2/pages/Settings/components/SidebarNavItem.scss.js +1 -1
  50. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts +1 -0
  51. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts.map +1 -1
  52. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.js +2 -2
  53. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.scss.js +1 -1
  54. package/dist/v2/styles/tokens/_colors.scss +19 -0
  55. package/dist/v2/utils/colourPicker/colors.d.ts +8 -0
  56. package/dist/v2/utils/colourPicker/colors.d.ts.map +1 -0
  57. package/dist/v2/utils/timeFormat/formatTime.d.ts +14 -0
  58. package/dist/v2/utils/timeFormat/formatTime.d.ts.map +1 -0
  59. package/package.json +3 -3
  60. package/src/v2/components/Badge/Badge.scss +1 -2
  61. package/src/v2/components/Checkbox/Checkbox.scss +37 -57
  62. package/src/v2/components/Checkbox/Checkbox.tsx +6 -44
  63. package/src/v2/components/ColorPicker/ColorPicker.scss +96 -0
  64. package/src/v2/components/ColorPicker/ColorPicker.stories.tsx +68 -0
  65. package/src/v2/components/ColorPicker/ColorPicker.tsx +49 -0
  66. package/src/v2/components/ColorPicker/index.ts +1 -0
  67. package/src/v2/components/FeatureCard/FeatureCard.scss +65 -0
  68. package/src/v2/components/FeatureCard/FeatureCard.stories.tsx +42 -0
  69. package/src/v2/components/FeatureCard/FeatureCard.tsx +37 -0
  70. package/src/v2/components/FeatureCard/index.ts +2 -0
  71. package/src/v2/components/IconButton/IconButton.scss +1 -1
  72. package/src/v2/components/IconButton/IconButton.tsx +41 -2
  73. package/src/v2/components/PeriodCard/PeriodCard.tsx +76 -13
  74. package/src/v2/components/index.ts +6 -0
  75. package/src/v2/icons/index.tsx +29 -4
  76. package/src/v2/pages/SettingsSubPage/SettingsSubPage.scss +4 -4
  77. package/src/v2/pages/SettingsSubPage/SettingsSubPage.tsx +3 -1
  78. package/src/v2/styles/tokens/_colors.scss +19 -0
  79. package/src/v2/utils/colourPicker/colors.ts +17 -0
  80. package/src/v2/utils/timeFormat/formatTime.ts +18 -0
@@ -0,0 +1,42 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { FeatureCard } from './FeatureCard'
3
+ import { AnalyticsIcon } from '../../icons'
4
+ import * as React from 'react'
5
+
6
+ const meta: Meta<typeof FeatureCard> = {
7
+ title: 'V2/Components/FeatureCard',
8
+ component: FeatureCard,
9
+ parameters: {
10
+ layout: 'centered',
11
+ },
12
+ tags: ['autodocs'],
13
+ }
14
+
15
+ export default meta
16
+ type Story = StoryObj<typeof FeatureCard>
17
+
18
+ export const Default: Story = {
19
+ args: {
20
+ icon: <AnalyticsIcon />,
21
+ title: 'Dynamic Pricing',
22
+ description: 'When enabled, you will be able to set different prices for different times of the day.',
23
+ },
24
+ }
25
+
26
+ export const WithAction: Story = {
27
+ args: {
28
+ icon: <AnalyticsIcon />,
29
+ title: 'Variable Pricing',
30
+ description: 'Set different prices for different days of the week or periods.',
31
+ action: <div style={{ width: '40px', height: '24px', background: '#ccc', borderRadius: '12px' }} />,
32
+ },
33
+ }
34
+
35
+ export const CustomClassName: Story = {
36
+ args: {
37
+ icon: <AnalyticsIcon />,
38
+ title: 'Custom Styled Card',
39
+ description: 'This card has a custom CSS class applied to it.',
40
+ className: 'custom-feature-card',
41
+ },
42
+ }
@@ -0,0 +1,37 @@
1
+ import * as React from 'react'
2
+ import './FeatureCard.scss'
3
+
4
+ export interface FeatureCardProps {
5
+ icon: React.ReactNode
6
+ title: string
7
+ description: string
8
+ action?: React.ReactNode
9
+ className?: string
10
+ }
11
+
12
+ export const FeatureCard: React.FC<FeatureCardProps> = ({
13
+ icon,
14
+ title,
15
+ description,
16
+ action,
17
+ className = '',
18
+ }) => {
19
+ return (
20
+ <div className={`feature-card ${className}`}>
21
+ <div className="feature-card__content">
22
+ <div className="feature-card__icon-wrapper">
23
+ {icon}
24
+ </div>
25
+ <div className="feature-card__text">
26
+ <h3 className="feature-card__title">{title}</h3>
27
+ <p className="feature-card__description">{description}</p>
28
+ </div>
29
+ </div>
30
+ {action && (
31
+ <div className="feature-card__action">
32
+ {action}
33
+ </div>
34
+ )}
35
+ </div>
36
+ )
37
+ }
@@ -0,0 +1,2 @@
1
+ export { FeatureCard } from './FeatureCard'
2
+ export type { FeatureCardProps } from './FeatureCard'
@@ -76,6 +76,6 @@
76
76
  color: var(--label-danger, #cc3c35);
77
77
 
78
78
  &:hover {
79
- background: var(--surface-primary, #fff);
79
+ background: var(--surface-danger-soft-hover, color-mix(in srgb, var(--surface-danger-soft) 85%, black));
80
80
  }
81
81
  }
@@ -6,12 +6,20 @@ export interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>
6
6
  label?: string
7
7
  icon?: 'back' | 'add' | 'delete' | ReactNode
8
8
  variant?: 'default' | 'danger'
9
+ backgroundColor?: string
10
+ borderColor?: string
11
+ hoverBackgroundColor?: string
12
+ hoverBorderColor?: string
9
13
  }
10
14
 
11
15
  export function IconButton({
12
16
  label,
13
17
  icon = 'back',
14
18
  variant = 'default',
19
+ backgroundColor,
20
+ borderColor,
21
+ hoverBackgroundColor,
22
+ hoverBorderColor,
15
23
  className = '',
16
24
  ...props
17
25
  }: IconButtonProps) {
@@ -22,6 +30,24 @@ export function IconButton({
22
30
  className,
23
31
  ].filter(Boolean).join(' ')
24
32
 
33
+ const style: any = {
34
+ ...(backgroundColor ? { backgroundColor } : {}),
35
+ ...(borderColor ? { borderColor } : {}),
36
+ ...(props.style || {}),
37
+ }
38
+
39
+ const handleMouseEnter = (e: React.MouseEvent<HTMLButtonElement>) => {
40
+ if (hoverBackgroundColor) e.currentTarget.style.backgroundColor = hoverBackgroundColor
41
+ if (hoverBorderColor) e.currentTarget.style.borderColor = hoverBorderColor
42
+ if (props.onMouseEnter) props.onMouseEnter(e)
43
+ }
44
+
45
+ const handleMouseLeave = (e: React.MouseEvent<HTMLButtonElement>) => {
46
+ e.currentTarget.style.backgroundColor = backgroundColor || ''
47
+ e.currentTarget.style.borderColor = borderColor || ''
48
+ if (props.onMouseLeave) props.onMouseLeave(e)
49
+ }
50
+
25
51
  const iconSize = isIconOnly ? 32 : 16
26
52
 
27
53
  const renderIcon = () => {
@@ -33,14 +59,27 @@ export function IconButton({
33
59
 
34
60
  if (isIconOnly) {
35
61
  return (
36
- <button type="button" className={classes} {...props}>
62
+ <button
63
+ type="button"
64
+ className={classes}
65
+ style={style}
66
+ onMouseEnter={handleMouseEnter}
67
+ onMouseLeave={handleMouseLeave}
68
+ {...props}
69
+ >
37
70
  {renderIcon()}
38
71
  </button>
39
72
  )
40
73
  }
41
74
 
42
75
  return (
43
- <button className={classes} {...props}>
76
+ <button
77
+ className={classes}
78
+ style={style}
79
+ onMouseEnter={handleMouseEnter}
80
+ onMouseLeave={handleMouseLeave}
81
+ {...props}
82
+ >
44
83
  <span className="icon-button__icon">
45
84
  {renderIcon()}
46
85
  </span>
@@ -2,16 +2,18 @@ import React from 'react'
2
2
  import { NewInput } from '../NewInput'
3
3
  import { Checkbox } from '../Checkbox'
4
4
  import { IconButton } from '../IconButton'
5
- import { ClockIcon } from '../../icons'
5
+ import { ClockIcon, } from '../../icons'
6
6
  import './PeriodCard.scss'
7
7
 
8
8
  export interface PeriodCardValue {
9
- days: string[]
9
+ days?: string[]
10
10
  is24Hours: boolean
11
11
  startTime?: string
12
12
  endTime?: string
13
- maxCapacity: number
14
- minCapacity: number | null
13
+ startDate?: string
14
+ endDate?: string
15
+ maxCapacity?: number
16
+ minCapacity?: number | null
15
17
  }
16
18
 
17
19
  export interface PeriodCardLabels {
@@ -24,6 +26,8 @@ export interface PeriodCardLabels {
24
26
  alignToggle?: string
25
27
  startTime?: string
26
28
  endTime?: string
29
+ startDate?: string
30
+ endDate?: string
27
31
  }
28
32
 
29
33
  const DEFAULT_LABELS: Required<PeriodCardLabels> = {
@@ -36,6 +40,8 @@ const DEFAULT_LABELS: Required<PeriodCardLabels> = {
36
40
  alignToggle: 'Align with Opening Hours',
37
41
  startTime: 'Start Time',
38
42
  endTime: 'End Time',
43
+ startDate: 'Start Date',
44
+ endDate: 'End Date',
39
45
  }
40
46
 
41
47
  const DAY_OPTIONS = [
@@ -68,8 +74,18 @@ export interface PeriodCardProps {
68
74
  hideTime?: boolean
69
75
  /** Make the min value field optional (shows "(optional)" label) */
70
76
  minOptional?: boolean
71
- /** Custom icon for the badge. Defaults to ClockIcon */
77
+ /** Custom icon for the badge. Defaults to ClockIcon or CalendarIcon based on props */
72
78
  badgeIcon?: React.ReactNode
79
+ /** Type of the period card, determines the default badge icon */
80
+ type?: 'date_time' | 'range'
81
+ /** Background color for the delete icon button */
82
+ deleteBackgroundColor?: string
83
+ /** Border color for the delete icon button */
84
+ deleteBorderColor?: string
85
+ /** Hover background color for the delete icon button */
86
+ deleteHoverBackgroundColor?: string
87
+ /** Hover border color for the delete icon button */
88
+ deleteHoverBorderColor?: string
73
89
  /** Custom content. When provided, built-in sections (capacity, days, time) are not rendered. */
74
90
  children?: React.ReactNode
75
91
  className?: string
@@ -88,6 +104,11 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
88
104
  hideTime = false,
89
105
  minOptional = true,
90
106
  badgeIcon,
107
+ type,
108
+ deleteBackgroundColor,
109
+ deleteBorderColor,
110
+ deleteHoverBackgroundColor,
111
+ deleteHoverBorderColor,
91
112
  children,
92
113
  className = '',
93
114
  }) => {
@@ -127,7 +148,17 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
127
148
  {title && (
128
149
  <div className="period-card__title-row">
129
150
  <span className="period-card__title">{title}</span>
130
- {onDelete && <IconButton icon="delete" onClick={onDelete} />}
151
+ {onDelete && (
152
+ <IconButton
153
+ icon="delete"
154
+ variant="danger"
155
+ backgroundColor={deleteBackgroundColor}
156
+ borderColor={deleteBorderColor}
157
+ hoverBackgroundColor={deleteHoverBackgroundColor}
158
+ hoverBorderColor={deleteHoverBorderColor}
159
+ onClick={onDelete}
160
+ />
161
+ )}
131
162
  </div>
132
163
  )}
133
164
 
@@ -139,7 +170,15 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
139
170
  <span className="period-card__badge">{labels.badge}</span>
140
171
  </div>
141
172
  {onDelete && (
142
- <IconButton icon="delete" onClick={onDelete} />
173
+ <IconButton
174
+ icon="delete"
175
+ variant="danger"
176
+ backgroundColor={deleteBackgroundColor}
177
+ borderColor={deleteBorderColor}
178
+ hoverBackgroundColor={deleteHoverBackgroundColor}
179
+ hoverBorderColor={deleteHoverBorderColor}
180
+ onClick={onDelete}
181
+ />
143
182
  )}
144
183
  </div>
145
184
  )}
@@ -162,7 +201,7 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
162
201
  type="number"
163
202
  min={0}
164
203
  value={
165
- value.minCapacity === null || value.minCapacity === 0
204
+ value.minCapacity === null || value.minCapacity === undefined || value.minCapacity === 0
166
205
  ? ''
167
206
  : value.minCapacity
168
207
  }
@@ -179,7 +218,7 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
179
218
  label={labels.maxValue}
180
219
  type="number"
181
220
  min={1}
182
- value={value.maxCapacity === 0 ? '' : value.maxCapacity}
221
+ value={value.maxCapacity === 0 || value.maxCapacity === undefined ? '' : value.maxCapacity}
183
222
  onChange={(e) =>
184
223
  updateField({
185
224
  maxCapacity:
@@ -193,6 +232,30 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
193
232
  </div>
194
233
  )}
195
234
 
235
+ {/* Date Range */}
236
+ {type === 'range' && value && (
237
+ <div className="period-card__section">
238
+ <div className="period-card__row">
239
+ <NewInput
240
+ label={labels.startDate}
241
+ type="date"
242
+ value={value.startDate || ''}
243
+ onChange={(e) =>
244
+ updateField({ startDate: (e.target as HTMLInputElement).value })
245
+ }
246
+ />
247
+ <NewInput
248
+ label={labels.endDate}
249
+ type="date"
250
+ value={value.endDate || ''}
251
+ onChange={(e) =>
252
+ updateField({ endDate: (e.target as HTMLInputElement).value })
253
+ }
254
+ />
255
+ </div>
256
+ </div>
257
+ )}
258
+
196
259
  {/* Days */}
197
260
  {!hideDays && value && (
198
261
  <div className="period-card__section">
@@ -240,16 +303,16 @@ export const PeriodCard: React.FC<PeriodCardProps> = ({
240
303
  <NewInput
241
304
  label={labels.startTime}
242
305
  type="time"
243
- value={value.startTime || '09:00'}
244
- onChange={(e) =>
306
+ value={value.startTime || ''}
307
+ onChange={(e: { target: HTMLInputElement }) =>
245
308
  updateField({ startTime: (e.target as HTMLInputElement).value })
246
309
  }
247
310
  />
248
311
  <NewInput
249
312
  label={labels.endTime}
250
313
  type="time"
251
- value={value.endTime || '17:00'}
252
- onChange={(e) =>
314
+ value={value.endTime || ''}
315
+ onChange={(e: { target: HTMLInputElement }) =>
253
316
  updateField({ endTime: (e.target as HTMLInputElement).value })
254
317
  }
255
318
  />
@@ -1,3 +1,6 @@
1
+ export { ColorPicker } from './ColorPicker'
2
+ export type { ColorPickerProps, ColorOption } from './ColorPicker'
3
+
1
4
  export { IconButton } from './IconButton'
2
5
  export type { IconButtonProps } from './IconButton'
3
6
 
@@ -19,6 +22,9 @@ export type { TableControlsProps, TableSearchConfig, TableFilterConfig, TableHea
19
22
  export { EmptyState } from './EmptyState'
20
23
  export type { EmptyStateProps } from './EmptyState'
21
24
 
25
+ export { FeatureCard } from './FeatureCard'
26
+ export type { FeatureCardProps } from './FeatureCard'
27
+
22
28
 
23
29
  export { Tabs } from './Tabs'
24
30
  export type { TabsProps, TabItem } from './Tabs'
@@ -82,8 +82,8 @@ export const WaiversIcon = ({ width = 24, height = 24, className = '' }: { width
82
82
  </svg>
83
83
  )
84
84
 
85
- export const CalendarIcon = () => (
86
- <svg width="24" height="24" viewBox="0 0 32 32" fill="none">
85
+ export const CalendarIcon = ({ width = 24, height = 24 }: { width?: number; height?: number } = {}) => (
86
+ <svg width={width} height={height} viewBox="0 0 32 32" fill="none">
87
87
  <path d="M13 6V8H19V6H21V8H25C25.5523 8 26 8.44772 26 9V25C26 25.5523 25.5523 26 25 26H7C6.44772 26 6 25.5523 6 25V9C6 8.44772 6.44772 8 7 8H11V6H13ZM24 16H8V24H24V16ZM15 18V22H10V18H15ZM11 10H8V14H24V10H21V12H19V10H13V12H11V10Z" fill="currentColor" />
88
88
  </svg>
89
89
  )
@@ -108,6 +108,15 @@ export const EditIcon = () => (
108
108
  </svg>
109
109
  )
110
110
 
111
+ export const NoRulesIcon = ({ width = 24, height = 24, className = '' }: { width?: number; height?: number; className?: string } = {}) => (
112
+ <svg width={width} height={height} viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg" className={className}>
113
+ <path d="M24 6C25.6569 6 27 7.34315 27 9V11H25V23C25 24.6569 23.6569 26 22 26H8C6.34315 26 5 24.6569 5 23V21H21V23C21 23.5128 21.386 23.9355 21.8834 23.9933L22 24C22.5128 24 22.9355 23.614 22.9933 23.1166L23 23V8H10C9.48716 8 9.06449 8.38604 9.00673 8.88338L9 9V19H7V9C7 7.34315 8.34315 6 10 6H24Z" fill="black"/>
114
+ <path d="M11 11C11 10.4477 11.4477 10 12 10H20C20.5523 10 21 10.4477 21 11C21 11.5523 20.5523 12 20 12H12C11.4477 12 11 11.5523 11 11Z" fill="black" fill-opacity="0.25"/>
115
+ <path d="M11 15C11 14.4477 11.4477 14 12 14H20C20.5523 14 21 14.4477 21 15C21 15.5523 20.5523 16 20 16H12C11.4477 16 11 15.5523 11 15Z" fill="black" fill-opacity="0.25"/>
116
+ <path d="M11 19C11 18.4477 11.4477 18 12 18H20C20.5523 18 21 18.4477 21 19C21 19.5523 20.5523 20 20 20H12C11.4477 20 11 19.5523 11 19Z" fill="black" fill-opacity="0.25"/>
117
+ </svg>
118
+ )
119
+
111
120
  export const CalendarSmallIcon = () => (
112
121
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 22 22" fill="none">
113
122
  <path d="M8.9375 4.125V5.5H13.0625V4.125H14.4375V5.5H17.1875C17.5672 5.5 17.875 5.80781 17.875 6.1875V17.1875C17.875 17.5672 17.5672 17.875 17.1875 17.875H4.8125C4.43281 17.875 4.125 17.5672 4.125 17.1875V6.1875C4.125 5.80781 4.43281 5.5 4.8125 5.5H7.5625V4.125H8.9375ZM16.5 11H5.5V16.5H16.5V11ZM10.3125 12.375V15.125H6.875V12.375H10.3125ZM7.5625 6.875H5.5V9.625H16.5V6.875H14.4375V8.25H13.0625V6.875H8.9375V8.25H7.5625V6.875Z" fill="#626A90"/>
@@ -582,8 +591,21 @@ export const ReportsEmptyIcon = () => (
582
591
  </svg>
583
592
  )
584
593
 
585
- export const CurrencyPoundIcon = ({ size = 28 }: { size?: number } = {}) => (
586
- <svg width={size} height={size} viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
594
+ export const CurrencyPoundIcon = ({
595
+ size = 28,
596
+ className = '',
597
+ }: {
598
+ size?: number
599
+ className?: string
600
+ } = {}) => (
601
+ <svg
602
+ width={size}
603
+ height={size}
604
+ viewBox="0 0 32 32"
605
+ fill="none"
606
+ xmlns="http://www.w3.org/2000/svg"
607
+ className={className}
608
+ >
587
609
  <path d="M16.0049 26.0028C10.482 26.0028 6.00488 21.5257 6.00488 16.0028C6.00488 10.48 10.482 6.00281 16.0049 6.00281C21.5277 6.00281 26.0049 10.48 26.0049 16.0028C26.0049 21.5257 21.5277 26.0028 16.0049 26.0028ZM16.0049 24.0028C20.4232 24.0028 24.0049 20.4211 24.0049 16.0028C24.0049 11.5845 20.4232 8.00281 16.0049 8.00281C11.5866 8.00281 8.00488 11.5845 8.00488 16.0028C8.00488 20.4211 11.5866 24.0028 16.0049 24.0028ZM13.0049 17.0028H12.0049V15.0028H13.0049V14.0028C13.0049 12.0698 14.5719 10.5028 16.5049 10.5028C17.9741 10.5028 19.2319 11.4081 19.7509 12.6913L17.7644 13.1879C17.4971 12.7756 17.0329 12.5028 16.5049 12.5028C15.6765 12.5028 15.0049 13.1744 15.0049 14.0028V15.0028H18.0049V17.0028H15.0049V19.0028H20.0049V21.0028H12.0049V19.0028H13.0049V17.0028Z" fill="currentColor"/>
588
610
  </svg>
589
611
  )
@@ -734,6 +756,9 @@ export const IconGripVertical: React.FC<ShadcnIconProps> = ({ className = '', si
734
756
  </svg>
735
757
  )
736
758
 
759
+ export const IconPlus = PlusIcon
760
+ export const IconPlusThick = PlusIcon
761
+
737
762
  // ── Sandbox icon aliases (used by shadcn ui components) ─────────────────────
738
763
  export const IconArrowLeft = ArrowLeftIcon
739
764
  export const IconArrowRight = ArrowRightIcon
@@ -4,7 +4,7 @@
4
4
  align-self: stretch;
5
5
 
6
6
  &__back {
7
- padding: 24px 32px 0 0;
7
+ padding: 24px 0 0 0;
8
8
  align-self: flex-start;
9
9
 
10
10
  .ghost-button {
@@ -23,15 +23,15 @@
23
23
  }
24
24
 
25
25
  @media (max-width: 768px) {
26
- padding: 16px 16px 0 0;
26
+ padding: 16px 0 0 0;
27
27
  }
28
28
  }
29
29
 
30
30
  &__content {
31
- padding: 24px 0;
31
+ padding: 0;
32
32
 
33
33
  @media (max-width: 768px) {
34
- padding: 0;
34
+ padding: 16px 0;
35
35
  }
36
36
  }
37
37
 
@@ -11,6 +11,7 @@ export interface SettingsSubPageProps {
11
11
  actionLabel?: string
12
12
  onAction?: () => void
13
13
  children?: React.ReactNode
14
+ showDivider?: boolean
14
15
  }
15
16
 
16
17
  export const SettingsSubPage: React.FC<SettingsSubPageProps> = ({
@@ -20,6 +21,7 @@ export const SettingsSubPage: React.FC<SettingsSubPageProps> = ({
20
21
  actionLabel,
21
22
  onAction,
22
23
  children,
24
+ showDivider = true,
23
25
  }) => {
24
26
  return (
25
27
  <div className="settings-sub-page">
@@ -32,7 +34,7 @@ export const SettingsSubPage: React.FC<SettingsSubPageProps> = ({
32
34
  )}
33
35
  <NewPageHeader
34
36
  title={title}
35
- showDivider
37
+ showDivider={showDivider}
36
38
  />
37
39
  <div className="settings-sub-page__content">
38
40
  {onAction && actionLabel && (
@@ -116,6 +116,16 @@
116
116
  --pink-800: #80224D;
117
117
  --pink-900: #611A3B;
118
118
 
119
+ --grey-100: #F8F8FA;
120
+ --grey-200: #E8E9EF;
121
+ --grey-300: #D2D5E3;
122
+ --grey-400: #B6BACC;
123
+ --grey-500: #9399B3;
124
+ --grey-600: #626A90;
125
+ --grey-700: #433D7B;
126
+ --grey-800: #14215A;
127
+ --grey-900: #0B1232;
128
+
119
129
  /* Teals */
120
130
  --teal-50: #E9FAF7;
121
131
  --teal-100: #BAF0E7;
@@ -218,6 +228,15 @@
218
228
  --pink-darker: var(--pink-700);
219
229
  --pink-darkest: var(--pink-800);
220
230
 
231
+ /* Grey Scale */
232
+ --grey-lightest: var(--grey-50);
233
+ --grey-lighter: var(--grey-100);
234
+ --grey-light: var(--grey-300);
235
+ --grey-regular: var(--grey-500);
236
+ --grey-dark: var(--grey-600);
237
+ --grey-darker: var(--grey-700);
238
+ --grey-darkest: var(--grey-800);
239
+
221
240
  /* Green Scale */
222
241
  --green-lightest: var(--green-50);
223
242
  --green-lighter: var(--green-100);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Standard color palette for pricing periods and other color picker components
3
+ */
4
+ export const COLORS = [
5
+ { name: 'red', hex: '#E0423A' },
6
+ { name: 'orange', hex: '#FD7E14' },
7
+ { name: 'yellow', hex: '#FBB912' },
8
+ { name: 'green', hex: '#52C22B' },
9
+ { name: 'teal', hex: '#22CEB1' },
10
+ { name: 'cyan', hex: '#2BD9FF' },
11
+ { name: 'blue', hex: '#0E8CE2' },
12
+ { name: 'indigo', hex: '#5D5BF4' },
13
+ { name: 'purple', hex: '#6200EE' },
14
+ { name: 'pink', hex: '#EC1479' },
15
+ { name: 'grey', hex: '#9399B3' },
16
+ ]
17
+
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Formats time from "HH:mm:ss" to "HH:mm" format
3
+ * Useful for converting HTML time input values to backend-compatible format
4
+ *
5
+ * @param time - Time string in "HH:mm:ss" or "HH:mm" format
6
+ * @returns Time string in "HH:mm" format, or undefined if input is undefined
7
+ *
8
+ * @example
9
+ * formatTimeToHHMM("09:00:00") // returns "09:00"
10
+ * formatTimeToHHMM("17:30") // returns "17:30"
11
+ * formatTimeToHHMM(undefined) // returns undefined
12
+ */
13
+ export const formatTimeToHHMM = (time?: string): string | undefined => {
14
+ if (!time) return undefined
15
+ // Extract HH:mm from HH:mm:ss (or return as-is if already HH:mm)
16
+ return time.substring(0, 5)
17
+ }
18
+