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

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 (90) 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/navigation/DashboardLayout/DashboardLayout.d.ts.map +1 -1
  45. package/dist/v2/navigation/DashboardLayout/DashboardLayout.js +14 -11
  46. package/dist/v2/navigation/DashboardLayout/DashboardLayout.scss.js +1 -1
  47. package/dist/v2/navigation/DashboardLayout/ProviderSidebar.scss.js +1 -1
  48. package/dist/v2/pages/Settings/SettingsPage.scss.js +1 -1
  49. package/dist/v2/pages/Settings/SettingsTabs.scss.js +1 -1
  50. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +2 -0
  51. package/dist/v2/pages/Settings/components/SidebarCustomisation.scss.js +1 -1
  52. package/dist/v2/pages/Settings/components/SidebarNavItem.js +2 -0
  53. package/dist/v2/pages/Settings/components/SidebarNavItem.scss.js +1 -1
  54. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts +1 -0
  55. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts.map +1 -1
  56. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.js +2 -2
  57. package/dist/v2/pages/SettingsSubPage/SettingsSubPage.scss.js +1 -1
  58. package/dist/v2/styles/form/NewInput.scss +11 -0
  59. package/dist/v2/styles/form/NewInput.scss.js +1 -1
  60. package/dist/v2/styles/tokens/_colors.scss +19 -0
  61. package/dist/v2/utils/colourPicker/colors.d.ts +8 -0
  62. package/dist/v2/utils/colourPicker/colors.d.ts.map +1 -0
  63. package/dist/v2/utils/timeFormat/formatTime.d.ts +14 -0
  64. package/dist/v2/utils/timeFormat/formatTime.d.ts.map +1 -0
  65. package/package.json +3 -3
  66. package/src/v2/components/Badge/Badge.scss +1 -2
  67. package/src/v2/components/Checkbox/Checkbox.scss +37 -57
  68. package/src/v2/components/Checkbox/Checkbox.tsx +6 -44
  69. package/src/v2/components/ColorPicker/ColorPicker.scss +96 -0
  70. package/src/v2/components/ColorPicker/ColorPicker.stories.tsx +68 -0
  71. package/src/v2/components/ColorPicker/ColorPicker.tsx +49 -0
  72. package/src/v2/components/ColorPicker/index.ts +1 -0
  73. package/src/v2/components/FeatureCard/FeatureCard.scss +65 -0
  74. package/src/v2/components/FeatureCard/FeatureCard.stories.tsx +42 -0
  75. package/src/v2/components/FeatureCard/FeatureCard.tsx +37 -0
  76. package/src/v2/components/FeatureCard/index.ts +2 -0
  77. package/src/v2/components/IconButton/IconButton.scss +1 -1
  78. package/src/v2/components/IconButton/IconButton.tsx +41 -2
  79. package/src/v2/components/PeriodCard/PeriodCard.tsx +76 -13
  80. package/src/v2/components/index.ts +6 -0
  81. package/src/v2/icons/index.tsx +29 -4
  82. package/src/v2/navigation/DashboardLayout/DashboardLayout.scss +6 -0
  83. package/src/v2/navigation/DashboardLayout/DashboardLayout.tsx +4 -2
  84. package/src/v2/navigation/DashboardLayout/ProviderSidebar.scss +8 -0
  85. package/src/v2/pages/SettingsSubPage/SettingsSubPage.scss +4 -4
  86. package/src/v2/pages/SettingsSubPage/SettingsSubPage.tsx +3 -1
  87. package/src/v2/styles/form/NewInput.scss +11 -0
  88. package/src/v2/styles/tokens/_colors.scss +19 -0
  89. package/src/v2/utils/colourPicker/colors.ts +17 -0
  90. package/src/v2/utils/timeFormat/formatTime.ts +18 -0
@@ -0,0 +1,68 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { ColorPicker } from './ColorPicker'
3
+ import * as React from 'react'
4
+ import { useState } from 'react'
5
+
6
+ const meta: Meta<typeof ColorPicker> = {
7
+ title: 'V2/Components/ColorPicker',
8
+ component: ColorPicker,
9
+ parameters: {
10
+ layout: 'centered',
11
+ },
12
+ tags: ['autodocs'],
13
+ }
14
+
15
+ export default meta
16
+ type Story = StoryObj<typeof ColorPicker>
17
+
18
+ const MOCK_COLORS = [
19
+ { name: 'Red', hex: '#EF4444' },
20
+ { name: 'Orange', hex: '#F97316' },
21
+ { name: 'Amber', hex: '#F59E0B' },
22
+ { name: 'Yellow', hex: '#EAB308' },
23
+ { name: 'Lime', hex: '#84CC16' },
24
+ { name: 'Green', hex: '#22C55E' },
25
+ { name: 'Emerald', hex: '#10B981' },
26
+ { name: 'Teal', hex: '#14B8A6' },
27
+ { name: 'Cyan', hex: '#06B6D4' },
28
+ { name: 'Sky', hex: '#0EA5E9' },
29
+ { name: 'Blue', hex: '#3B82F6' },
30
+ ]
31
+
32
+ export const Default: Story = {
33
+ args: {
34
+ colors: MOCK_COLORS,
35
+ selectedColor: '#EF4444',
36
+ onChange: (hex: string) => console.log('Selected color:', hex),
37
+ t: (key: string) => key,
38
+ },
39
+ }
40
+
41
+ export const Controlled: Story = {
42
+ render: (args) => {
43
+ const ControlledExample = () => {
44
+ const [selected, setSelected] = useState('#3B82F6')
45
+ return (
46
+ <ColorPicker
47
+ {...args}
48
+ selectedColor={selected}
49
+ onChange={setSelected}
50
+ t={(key: string) => key}
51
+ />
52
+ )
53
+ }
54
+ return <ControlledExample />
55
+ },
56
+ args: {
57
+ colors: MOCK_COLORS,
58
+ },
59
+ }
60
+
61
+ export const NoSelection: Story = {
62
+ args: {
63
+ colors: MOCK_COLORS,
64
+ selectedColor: '',
65
+ onChange: (hex: string) => console.log('Selected color:', hex),
66
+ t: (key: string) => key,
67
+ },
68
+ }
@@ -0,0 +1,49 @@
1
+ import React from 'react'
2
+ import './ColorPicker.scss'
3
+
4
+ export interface ColorOption {
5
+ name: string
6
+ hex: string
7
+ }
8
+
9
+ export interface ColorPickerProps {
10
+ colors: ColorOption[]
11
+ selectedColor?: string
12
+ onChange: (hex: string) => void
13
+ t: (key: string) => string
14
+ error?: string
15
+ }
16
+
17
+ export const ColorPicker: React.FC<ColorPickerProps> = ({
18
+ colors,
19
+ selectedColor,
20
+ onChange,
21
+ t,
22
+ error,
23
+ }) => {
24
+ return (
25
+ <div className={`color-picker-grid ${error ? 'color-picker-grid--error' : ''}`}>
26
+ {colors.map((color) => (
27
+ <button
28
+ key={color.name}
29
+ type="button"
30
+ className="color-picker-button"
31
+ onClick={() => onChange(color.hex)}
32
+ >
33
+ <div
34
+ className={`color-picker-outer-circle ${
35
+ selectedColor === color.hex ? 'color-picker-outer-circle--selected' : ''
36
+ }`}
37
+ style={selectedColor === color.hex ? { borderColor: color.hex, borderWidth: '2px' } : {}}
38
+ >
39
+ <div
40
+ className="color-picker-inner-circle"
41
+ style={{ backgroundColor: color.hex }}
42
+ />
43
+ </div>
44
+ <span className="color-picker-name">{t(color.name)}</span>
45
+ </button>
46
+ ))}
47
+ </div>
48
+ )
49
+ }
@@ -0,0 +1 @@
1
+ export * from './ColorPicker'
@@ -0,0 +1,65 @@
1
+ @import '../../styles/tokens/colors';
2
+ @import '../../styles/tokens/sizes';
3
+
4
+ .feature-card {
5
+ font-family: var(--font-family-sans, 'Geist', sans-serif), serif;
6
+ display: flex;
7
+ flex-direction: column;
8
+ justify-content: space-between;
9
+ gap: 20px;
10
+ padding: 12px;
11
+ background-color: var(--surface-secondary);
12
+ border: 1px solid var(--border-primary);
13
+ border-radius: 12px;
14
+
15
+ @media (min-width: 640px) {
16
+ flex-direction: row;
17
+ align-items: center;
18
+ }
19
+
20
+ &__content {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: 20px;
24
+ flex: 1;
25
+ }
26
+
27
+ &__icon-wrapper {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ flex-shrink: 0;
32
+ }
33
+
34
+ &__text {
35
+ display: flex;
36
+ flex-direction: column;
37
+ flex: 1;
38
+ }
39
+
40
+ &__title {
41
+ font-size: 16px;
42
+ line-height: 24px;
43
+ font-weight: 500;
44
+ color: var(--label-primary);
45
+ margin: 0;
46
+ }
47
+
48
+ &__description {
49
+ font-size: 14px;
50
+ line-height: 20px;
51
+ color: var(--label-primary);
52
+ opacity: 0.8;
53
+ margin: 4px 0 0;
54
+ }
55
+
56
+ &__action {
57
+ display: flex;
58
+ align-items: center;
59
+ width: 100%;
60
+
61
+ @media (min-width: 640px) {
62
+ width: auto;
63
+ }
64
+ }
65
+ }
@@ -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
@@ -56,6 +56,12 @@
56
56
  flex: 1;
57
57
  min-height: 0;
58
58
  overflow-y: auto;
59
+ display: flex;
60
+ flex-direction: column;
61
+ }
62
+
63
+ &__content-inner {
64
+ flex: 1 0 auto;
59
65
  padding-left: var(--container-padding-desktop, 32px);
60
66
  padding-right: var(--container-padding-desktop, 32px);
61
67
  @media (max-width: 768px) {
@@ -232,9 +232,11 @@ export const DashboardLayout: React.FC<DashboardLayoutProps> = ({
232
232
  }}
233
233
  >
234
234
  <div id="main" className="dashboard-layout__content">
235
- {children}
235
+ <div className="dashboard-layout__content-inner">
236
+ {children}
237
+ </div>
238
+ {showFooter && <DashboardFooter version={version} />}
236
239
  </div>
237
- {showFooter && <DashboardFooter version={version} />}
238
240
  </main>
239
241
  </div>
240
242
 
@@ -231,6 +231,10 @@
231
231
  width: 100%;
232
232
  color: var(--fills-main-fill-primary, #14215A);
233
233
 
234
+ @media (max-width: 768px) {
235
+ padding: 10px;
236
+ }
237
+
234
238
  &:hover:not(&--active) {
235
239
  background: var(--surfaces-main-background-secondary-hover, #F0F0F4);
236
240
  }
@@ -308,5 +312,9 @@
308
312
  color: var(--labels-main-label-primary, #121E52);
309
313
  margin: 0;
310
314
  white-space: nowrap;
315
+
316
+ @media (max-width: 768px) {
317
+ font-size: 15px;
318
+ }
311
319
  }
312
320
  }