@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.
- package/dist/index.js +2 -0
- package/dist/v2/components/AccountManagerCard/AccountManagerCard.scss.js +1 -1
- package/dist/v2/components/ActionMenu/ActionMenu.scss.js +1 -1
- package/dist/v2/components/Alert/Alert.scss.js +1 -1
- package/dist/v2/components/AvatarUpload/AvatarUpload.scss.js +1 -1
- package/dist/v2/components/Badge/Badge.scss.js +1 -1
- package/dist/v2/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/v2/components/Checkbox/Checkbox.js +10 -50
- package/dist/v2/components/Checkbox/Checkbox.scss.js +1 -1
- package/dist/v2/components/ColorPicker/ColorPicker.d.ts +15 -0
- package/dist/v2/components/ColorPicker/ColorPicker.d.ts.map +1 -0
- package/dist/v2/components/ColorPicker/ColorPicker.js +40 -0
- package/dist/v2/components/ColorPicker/ColorPicker.scss.js +6 -0
- package/dist/v2/components/ColorPicker/index.d.ts +2 -0
- package/dist/v2/components/ColorPicker/index.d.ts.map +1 -0
- package/dist/v2/components/DataTable/DataTable.scss.js +1 -1
- package/dist/v2/components/EmptyState/EmptyState.scss.js +1 -1
- package/dist/v2/components/FeatureCard/FeatureCard.d.ts +11 -0
- package/dist/v2/components/FeatureCard/FeatureCard.d.ts.map +1 -0
- package/dist/v2/components/FeatureCard/FeatureCard.js +40 -0
- package/dist/v2/components/FeatureCard/FeatureCard.scss.js +6 -0
- package/dist/v2/components/FeatureCard/index.d.ts +3 -0
- package/dist/v2/components/FeatureCard/index.d.ts.map +1 -0
- package/dist/v2/components/FeatureToggle/FeatureToggle.scss.js +1 -1
- package/dist/v2/components/FormField/FormField.scss.js +1 -1
- package/dist/v2/components/IconButton/IconButton.d.ts +5 -1
- package/dist/v2/components/IconButton/IconButton.d.ts.map +1 -1
- package/dist/v2/components/IconButton/IconButton.js +28 -3
- package/dist/v2/components/IconButton/IconButton.scss.js +1 -1
- package/dist/v2/components/InfoGrid/InfoGrid.scss.js +1 -1
- package/dist/v2/components/NotificationBanner/NotificationBanner.scss.js +1 -1
- package/dist/v2/components/PeriodCard/PeriodCard.d.ts +18 -4
- package/dist/v2/components/PeriodCard/PeriodCard.d.ts.map +1 -1
- package/dist/v2/components/PeriodCard/PeriodCard.js +46 -6
- package/dist/v2/components/StatusBadge/StatusBadge.scss.js +1 -1
- package/dist/v2/components/TableControls/TableControls.scss.js +1 -1
- package/dist/v2/components/Tabs/Tabs.scss.js +1 -1
- package/dist/v2/components/WYSIWYGEditor/WYSIWYGEditor.scss.js +1 -1
- package/dist/v2/components/index.d.ts +4 -0
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/icons/index.d.ts +19 -2
- package/dist/v2/icons/index.d.ts.map +1 -1
- package/dist/v2/icons/index.js +21 -4
- package/dist/v2/navigation/DashboardLayout/DashboardLayout.d.ts.map +1 -1
- package/dist/v2/navigation/DashboardLayout/DashboardLayout.js +14 -11
- package/dist/v2/navigation/DashboardLayout/DashboardLayout.scss.js +1 -1
- package/dist/v2/navigation/DashboardLayout/ProviderSidebar.scss.js +1 -1
- package/dist/v2/pages/Settings/SettingsPage.scss.js +1 -1
- package/dist/v2/pages/Settings/SettingsTabs.scss.js +1 -1
- package/dist/v2/pages/Settings/components/SidebarCustomisation.js +2 -0
- package/dist/v2/pages/Settings/components/SidebarCustomisation.scss.js +1 -1
- package/dist/v2/pages/Settings/components/SidebarNavItem.js +2 -0
- package/dist/v2/pages/Settings/components/SidebarNavItem.scss.js +1 -1
- package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts +1 -0
- package/dist/v2/pages/SettingsSubPage/SettingsSubPage.d.ts.map +1 -1
- package/dist/v2/pages/SettingsSubPage/SettingsSubPage.js +2 -2
- package/dist/v2/pages/SettingsSubPage/SettingsSubPage.scss.js +1 -1
- package/dist/v2/styles/form/NewInput.scss +11 -0
- package/dist/v2/styles/form/NewInput.scss.js +1 -1
- package/dist/v2/styles/tokens/_colors.scss +19 -0
- package/dist/v2/utils/colourPicker/colors.d.ts +8 -0
- package/dist/v2/utils/colourPicker/colors.d.ts.map +1 -0
- package/dist/v2/utils/timeFormat/formatTime.d.ts +14 -0
- package/dist/v2/utils/timeFormat/formatTime.d.ts.map +1 -0
- package/package.json +3 -3
- package/src/v2/components/Badge/Badge.scss +1 -2
- package/src/v2/components/Checkbox/Checkbox.scss +37 -57
- package/src/v2/components/Checkbox/Checkbox.tsx +6 -44
- package/src/v2/components/ColorPicker/ColorPicker.scss +96 -0
- package/src/v2/components/ColorPicker/ColorPicker.stories.tsx +68 -0
- package/src/v2/components/ColorPicker/ColorPicker.tsx +49 -0
- package/src/v2/components/ColorPicker/index.ts +1 -0
- package/src/v2/components/FeatureCard/FeatureCard.scss +65 -0
- package/src/v2/components/FeatureCard/FeatureCard.stories.tsx +42 -0
- package/src/v2/components/FeatureCard/FeatureCard.tsx +37 -0
- package/src/v2/components/FeatureCard/index.ts +2 -0
- package/src/v2/components/IconButton/IconButton.scss +1 -1
- package/src/v2/components/IconButton/IconButton.tsx +41 -2
- package/src/v2/components/PeriodCard/PeriodCard.tsx +76 -13
- package/src/v2/components/index.ts +6 -0
- package/src/v2/icons/index.tsx +29 -4
- package/src/v2/navigation/DashboardLayout/DashboardLayout.scss +6 -0
- package/src/v2/navigation/DashboardLayout/DashboardLayout.tsx +4 -2
- package/src/v2/navigation/DashboardLayout/ProviderSidebar.scss +8 -0
- package/src/v2/pages/SettingsSubPage/SettingsSubPage.scss +4 -4
- package/src/v2/pages/SettingsSubPage/SettingsSubPage.tsx +3 -1
- package/src/v2/styles/form/NewInput.scss +11 -0
- package/src/v2/styles/tokens/_colors.scss +19 -0
- package/src/v2/utils/colourPicker/colors.ts +17 -0
- 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
|
+
}
|
|
@@ -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
|
|
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
|
|
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
|
|
5
|
+
import { ClockIcon, } from '../../icons'
|
|
6
6
|
import './PeriodCard.scss'
|
|
7
7
|
|
|
8
8
|
export interface PeriodCardValue {
|
|
9
|
-
days
|
|
9
|
+
days?: string[]
|
|
10
10
|
is24Hours: boolean
|
|
11
11
|
startTime?: string
|
|
12
12
|
endTime?: string
|
|
13
|
-
|
|
14
|
-
|
|
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 &&
|
|
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
|
|
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 || '
|
|
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 || '
|
|
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'
|
package/src/v2/icons/index.tsx
CHANGED
|
@@ -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=
|
|
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 = ({
|
|
586
|
-
|
|
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
|
-
|
|
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
|
}
|