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

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 (57) hide show
  1. package/dist/index.js +1 -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/Checkbox/Checkbox.d.ts.map +1 -1
  7. package/dist/v2/components/Checkbox/Checkbox.js +9 -18
  8. package/dist/v2/components/Checkbox/Checkbox.scss.js +1 -1
  9. package/dist/v2/components/ColorPicker/ColorPicker.d.ts +5 -3
  10. package/dist/v2/components/ColorPicker/ColorPicker.d.ts.map +1 -1
  11. package/dist/v2/components/ColorPicker/ColorPicker.js +55 -28
  12. package/dist/v2/components/ColorPicker/ColorPicker.scss.js +1 -1
  13. package/dist/v2/components/DataTable/DataTable.scss.js +1 -1
  14. package/dist/v2/components/EmptyState/EmptyState.scss.js +1 -1
  15. package/dist/v2/components/FeatureCard/FeatureCard.scss.js +1 -1
  16. package/dist/v2/components/FeatureToggle/FeatureToggle.scss.js +1 -1
  17. package/dist/v2/components/FormField/FormField.scss.js +1 -1
  18. package/dist/v2/components/InfoGrid/InfoGrid.scss.js +1 -1
  19. package/dist/v2/components/NotificationBanner/NotificationBanner.scss.js +1 -1
  20. package/dist/v2/components/RadioGroup/RadioGroup.d.ts +16 -0
  21. package/dist/v2/components/RadioGroup/RadioGroup.d.ts.map +1 -0
  22. package/dist/v2/components/RadioGroup/RadioGroup.js +54 -0
  23. package/dist/v2/components/RadioGroup/RadioGroup.scss.js +6 -0
  24. package/dist/v2/components/RadioGroup/index.d.ts +2 -0
  25. package/dist/v2/components/RadioGroup/index.d.ts.map +1 -0
  26. package/dist/v2/components/StatusBadge/StatusBadge.scss.js +1 -1
  27. package/dist/v2/components/TableControls/TableControls.scss.js +1 -1
  28. package/dist/v2/components/Tabs/Tabs.scss.js +1 -1
  29. package/dist/v2/components/WYSIWYGEditor/WYSIWYGEditor.scss.js +1 -1
  30. package/dist/v2/components/index.d.ts +1 -0
  31. package/dist/v2/components/index.d.ts.map +1 -1
  32. package/dist/v2/icons/index.js +25 -16
  33. package/dist/v2/pages/DeleteEntity/DeleteEntityPage.js +1 -1
  34. package/dist/v2/pages/Settings/SettingsPage.scss.js +1 -1
  35. package/dist/v2/pages/Settings/SettingsTabs.scss.js +1 -1
  36. package/dist/v2/pages/Settings/components/SidebarCustomisation.js +1 -0
  37. package/dist/v2/pages/Settings/components/SidebarCustomisation.scss.js +1 -1
  38. package/dist/v2/pages/Settings/components/SidebarNavItem.js +1 -0
  39. package/dist/v2/pages/Settings/components/SidebarNavItem.scss.js +1 -1
  40. package/dist/v2/styles/form/NewInput.scss +1 -1
  41. package/dist/v2/styles/form/NewInput.scss.js +1 -1
  42. package/dist/v2/styles/tokens/_colors.scss +1 -0
  43. package/package.json +3 -3
  44. package/src/v2/components/Checkbox/Checkbox.scss +61 -67
  45. package/src/v2/components/Checkbox/Checkbox.tsx +4 -9
  46. package/src/v2/components/ColorPicker/ColorPicker.scss +15 -2
  47. package/src/v2/components/ColorPicker/ColorPicker.tsx +45 -23
  48. package/src/v2/components/RadioGroup/RadioGroup.scss +86 -0
  49. package/src/v2/components/RadioGroup/RadioGroup.stories.tsx +71 -0
  50. package/src/v2/components/RadioGroup/RadioGroup.tsx +55 -0
  51. package/src/v2/components/RadioGroup/index.ts +1 -0
  52. package/src/v2/components/index.ts +3 -0
  53. package/src/v2/icons/index.tsx +4 -4
  54. package/src/v2/index.ts +10 -10
  55. package/src/v2/pages/DeleteEntity/DeleteEntityPage.tsx +1 -1
  56. package/src/v2/styles/form/NewInput.scss +1 -1
  57. package/src/v2/styles/tokens/_colors.scss +1 -0
@@ -3,15 +3,16 @@
3
3
  flex-wrap: wrap;
4
4
  column-gap: 20px;
5
5
  row-gap: 32px;
6
- margin-top: 16px;
7
6
  width: 100%;
8
7
  border-radius: 8px;
9
8
  border: 1px solid transparent;
10
9
  transition: all 0.2s;
11
10
 
12
11
  &--error {
13
- border-color: #E0423A;
12
+ border-color: var(--border-red-regular);
14
13
  background-color: rgba(224, 66, 58, 0.05);
14
+ padding: 8px;
15
+ margin-top: 8px;
15
16
  }
16
17
 
17
18
  @media (max-width: 480px) {
@@ -85,6 +86,18 @@
85
86
  height: 38px;
86
87
  border-radius: 50%;
87
88
  transition: all 0.2s ease-out;
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: center;
92
+ position: relative;
93
+ }
94
+
95
+ .color-picker-check-icon {
96
+ width: 20px;
97
+ height: 20px;
98
+ position: absolute;
99
+ color: white;
100
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3));
88
101
  }
89
102
 
90
103
  .color-picker-name {
@@ -1,4 +1,5 @@
1
1
  import React from 'react'
2
+ import { NotificationSuccessIcon } from '../../icons'
2
3
  import './ColorPicker.scss'
3
4
 
4
5
  export interface ColorOption {
@@ -9,9 +10,11 @@ export interface ColorOption {
9
10
  export interface ColorPickerProps {
10
11
  colors: ColorOption[]
11
12
  selectedColor?: string
12
- onChange: (hex: string) => void
13
- t: (key: string) => string
14
- error?: string
13
+ onChange: (...args: any[]) => void
14
+ t: (...args: any[]) => string
15
+ error?: string | boolean | null
16
+ label?: string
17
+ optional?: boolean
15
18
  }
16
19
 
17
20
  export const ColorPicker: React.FC<ColorPickerProps> = ({
@@ -20,30 +23,49 @@ export const ColorPicker: React.FC<ColorPickerProps> = ({
20
23
  onChange,
21
24
  t,
22
25
  error,
26
+ label,
27
+ optional,
23
28
  }) => {
29
+ const showError = !!error
24
30
  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' } : {}}
31
+ <div className="new-form-input">
32
+ {(label || optional) && (
33
+ <label className="new-form-input__label">
34
+ <span>{label}</span>
35
+ {optional && <span className="new-form-input__label-optional">(optional)</span>}
36
+ </label>
37
+ )}
38
+ <div className={`color-picker-grid ${showError ? 'color-picker-grid--error' : ''}`}>
39
+ {colors.map((color) => (
40
+ <button
41
+ key={color.name}
42
+ type="button"
43
+ className="color-picker-button"
44
+ onClick={() => onChange(color.hex)}
38
45
  >
39
46
  <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
+ className={`color-picker-outer-circle ${
48
+ selectedColor === color.hex ? 'color-picker-outer-circle--selected' : ''
49
+ }`}
50
+ style={selectedColor === color.hex ? { borderColor: color.hex, borderWidth: '2px' } : {}}
51
+ >
52
+ <div
53
+ className="color-picker-inner-circle"
54
+ style={{ backgroundColor: color.hex }}
55
+ >
56
+ {selectedColor === color.hex && (
57
+ <NotificationSuccessIcon
58
+ size={20}
59
+ className="color-picker-check-icon"
60
+ />
61
+ )}
62
+ </div>
63
+ </div>
64
+ <span className="color-picker-name">{t(color.name)}</span>
65
+ </button>
66
+ ))}
67
+ </div>
68
+ <p className="pricing-period-form__hint">{t('colourHint')}</p>
47
69
  </div>
48
70
  )
49
71
  }
@@ -0,0 +1,86 @@
1
+ .radio-group {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 0;
5
+ }
6
+
7
+ .radio-group-item {
8
+ display: flex;
9
+ flex: 1;
10
+ padding: 12px 4px;
11
+ align-items: center;
12
+ gap: 8px;
13
+ border-radius: 8px;
14
+ cursor: pointer;
15
+ transition: background-color 0.2s ease;
16
+ user-select: none;
17
+
18
+ &:hover {
19
+ background-color: var(--surface-primary-hover, #F3F4F6);
20
+ }
21
+
22
+ &__input-wrapper {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ padding: 0 12px;
27
+ position: relative;
28
+ }
29
+
30
+ &__input {
31
+ position: absolute;
32
+ opacity: 0;
33
+ width: 0;
34
+ height: 0;
35
+ cursor: pointer;
36
+ }
37
+
38
+ &__circle {
39
+ width: 16px;
40
+ height: 16px;
41
+ border-radius: 50%;
42
+ border: 1px solid var(--border-primary, #E5E7EB);
43
+ background-color: var(--surface-primary, #FFFFFF);
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ transition: border-color 0.2s ease;
48
+ }
49
+
50
+ &__inner-dot {
51
+ width: 10px;
52
+ height: 10px;
53
+ border-radius: 50%;
54
+ background-color: var(--fill-primary, #14215A);
55
+ transform: scale(0);
56
+ transition: transform 0.2s ease;
57
+ }
58
+
59
+ &__input:checked + &__circle {
60
+ .radio-group-item__inner-dot {
61
+ transform: scale(1);
62
+ }
63
+ }
64
+
65
+ &__content {
66
+ display: flex;
67
+ flex-direction: column;
68
+ flex: 1;
69
+ min-width: 0;
70
+ }
71
+
72
+ &__title {
73
+ color: var(--label-primary, #111827);
74
+ font-size: 14px;
75
+ font-weight: 600;
76
+ line-height: 1.25;
77
+ }
78
+
79
+ &__description {
80
+ color: var(--label-secondary, #6B7280);
81
+ font-size: 12px;
82
+ font-weight: 400;
83
+ line-height: 1.5;
84
+ margin: 0;
85
+ }
86
+ }
@@ -0,0 +1,71 @@
1
+ import React, { useState } from 'react'
2
+ import { Meta, StoryObj } from '@storybook/react'
3
+ import { RadioGroup } from './RadioGroup'
4
+
5
+ export default {
6
+ title: 'v2/Components/RadioGroup',
7
+ component: RadioGroup,
8
+ args: {
9
+ name: 'radio-group-example',
10
+ options: [
11
+ { value: 'option1', label: 'Option 1' },
12
+ { value: 'option2', label: 'Option 2' },
13
+ { value: 'option3', label: 'Option 3' },
14
+ ],
15
+ value: 'option1',
16
+ },
17
+ } as Meta<typeof RadioGroup>
18
+
19
+ type Story = StoryObj<typeof RadioGroup>
20
+
21
+ export const Default: Story = {
22
+ render: (args) => {
23
+ const [value, setValue] = useState(args.value)
24
+ return <RadioGroup {...args} value={value} onChange={setValue} />
25
+ },
26
+ }
27
+
28
+ export const WithDescriptions: Story = {
29
+ args: {
30
+ options: [
31
+ {
32
+ value: 'all',
33
+ label: 'All conditions are met',
34
+ description: 'Every rule must be satisfied for this tier to apply',
35
+ },
36
+ {
37
+ value: 'any',
38
+ label: 'Any condition is met',
39
+ description: 'At least one rule must be satisfied for this tier to apply',
40
+ },
41
+ ],
42
+ value: 'all',
43
+ },
44
+ render: (args) => {
45
+ const [value, setValue] = useState(args.value)
46
+ return <RadioGroup {...args} value={value} onChange={setValue} />
47
+ },
48
+ }
49
+
50
+ export const Controlled: Story = {
51
+ render: () => {
52
+ const [value, setValue] = useState('one')
53
+ const options = [
54
+ { value: 'one', label: 'Label One', description: 'Description for label one' },
55
+ { value: 'two', label: 'Label Two', description: 'Description for label two' },
56
+ ]
57
+ return (
58
+ <div style={{ maxWidth: '400px', padding: '20px', background: '#fff' }}>
59
+ <RadioGroup
60
+ name="controlled-example"
61
+ value={value}
62
+ onChange={setValue}
63
+ options={options}
64
+ />
65
+ <div style={{ marginTop: '20px', fontSize: '14px' }}>
66
+ Selected value: <strong>{value}</strong>
67
+ </div>
68
+ </div>
69
+ )
70
+ },
71
+ }
@@ -0,0 +1,55 @@
1
+ import React from 'react'
2
+ import './RadioGroup.scss'
3
+
4
+ export interface RadioOption {
5
+ value: string
6
+ label: string
7
+ description?: string
8
+ }
9
+
10
+ export interface RadioGroupProps {
11
+ name: string
12
+ options: RadioOption[]
13
+ value: string
14
+ onChange: (value: string) => void
15
+ className?: string
16
+ }
17
+
18
+ export const RadioGroup: React.FC<RadioGroupProps> = ({
19
+ name,
20
+ options,
21
+ value,
22
+ onChange,
23
+ className = '',
24
+ }) => {
25
+ return (
26
+ <div className={`radio-group ${className}`} role="radiogroup">
27
+ {options.map((opt) => (
28
+ <label
29
+ key={opt.value}
30
+ className={`radio-group-item ${value === opt.value ? 'radio-group-item--selected' : ''}`}
31
+ >
32
+ <div className="radio-group-item__input-wrapper">
33
+ <input
34
+ type="radio"
35
+ name={name}
36
+ value={opt.value}
37
+ checked={value === opt.value}
38
+ onChange={() => onChange(opt.value)}
39
+ className="radio-group-item__input"
40
+ />
41
+ <div className="radio-group-item__circle">
42
+ <div className="radio-group-item__inner-dot" />
43
+ </div>
44
+ </div>
45
+ <div className="radio-group-item__content">
46
+ <span className="radio-group-item__title">{opt.label}</span>
47
+ {opt.description && (
48
+ <p className="radio-group-item__description">{opt.description}</p>
49
+ )}
50
+ </div>
51
+ </label>
52
+ ))}
53
+ </div>
54
+ )
55
+ }
@@ -0,0 +1 @@
1
+ export * from './RadioGroup'
@@ -67,6 +67,7 @@ export type { CheckboxProps } from './Checkbox'
67
67
  export { InputCheckbox } from './InputCheckbox'
68
68
  export type { InputCheckboxProps } from './InputCheckbox'
69
69
 
70
+
70
71
  export { WYSIWYGEditor } from './WYSIWYGEditor'
71
72
  export type { WYSIWYGEditorProps } from './WYSIWYGEditor'
72
73
 
@@ -114,6 +115,8 @@ export type { PaginationProps } from './Pagination'
114
115
  export { RadioCardGroup } from './RadioCard'
115
116
  export type { RadioCardGroupProps, RadioCardOption } from './RadioCard'
116
117
 
118
+ export * from './RadioGroup'
119
+
117
120
  export { ZoneCard, ZoneContainer, ZoneHeader, ResourceRow, AddResourceButton } from './ZoneCard'
118
121
  export type { ZoneCardProps, ZoneResource, ZoneContainerProps, DragHandleProps, ZoneHeaderProps, ResourceRowProps, AddResourceButtonProps } from './ZoneCard'
119
122
 
@@ -110,10 +110,10 @@ export const EditIcon = () => (
110
110
 
111
111
  export const NoRulesIcon = ({ width = 24, height = 24, className = '' }: { width?: number; height?: number; className?: string } = {}) => (
112
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"/>
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="currentColor"/>
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="currentColor" fillOpacity="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="currentColor" fillOpacity="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="currentColor" fillOpacity="0.25"/>
117
117
  </svg>
118
118
  )
119
119
 
package/src/v2/index.ts CHANGED
@@ -143,11 +143,11 @@ export { SidebarWithAuth } from './navigation/SidebarWithAuth'
143
143
  export type { SidebarWithAuthProps } from './navigation/SidebarWithAuth'
144
144
 
145
145
  // Dashboard Layout (Complete layout with sidebar, tophat, and content area)
146
- export {
147
- DashboardLayout,
148
- ProviderSidebar,
149
- AdminSidebar,
150
- TopNavigation,
146
+ export {
147
+ DashboardLayout,
148
+ ProviderSidebar,
149
+ AdminSidebar,
150
+ TopNavigation,
151
151
  DashboardFooter,
152
152
  // Sidebar Icons
153
153
  HomeIcon,
@@ -161,14 +161,14 @@ export {
161
161
  WaiversIcon,
162
162
  SettingsIcon,
163
163
  } from './navigation/DashboardLayout'
164
- export type {
165
- DashboardLayoutProps,
164
+ export type {
165
+ DashboardLayoutProps,
166
166
  DestinationType,
167
167
  ProviderSidebarProps,
168
168
  NavItem,
169
- AdminSidebarProps,
170
- TopNavigationProps,
171
- DashboardFooterProps
169
+ AdminSidebarProps,
170
+ TopNavigationProps,
171
+ DashboardFooterProps
172
172
  } from './navigation/DashboardLayout'
173
173
 
174
174
  // Navigation Configuration
@@ -49,7 +49,7 @@ export function DeleteEntityPage({
49
49
  const [confirmationError, setConfirmationError] = useState(false)
50
50
 
51
51
  const handleDelete = async () => {
52
- if (confirmationInput.toLowerCase() !== confirmWord.toLowerCase()) {
52
+ if (confirmationInput.trim().toLowerCase() !== confirmWord.trim().toLowerCase()) {
53
53
  setConfirmationError(true)
54
54
  return
55
55
  }
@@ -92,7 +92,7 @@
92
92
  line-height: var(--text-regular-line, 20px);
93
93
  color: var(--labels-main-label-primary, #121e52);
94
94
  background-color: var(--surfaces-main-background-secondary, #f8f8fa);
95
- border: 1px solid var(--borders-main-border-primary, #e8e9ef);
95
+ border: 2px solid var(--borders-main-border-primary, #e8e9ef);
96
96
  border-radius: var(--radius-md, 4px);
97
97
  padding: 8px 10px;
98
98
  min-height: 120px;
@@ -427,6 +427,7 @@
427
427
  --border-status-info: var(--information-lighter);
428
428
  --border-status-disabled: var(--disabled-lightest);
429
429
  --border-colour-overlay: #121E521A;
430
+ --border-red-regular: var(--red-regular);
430
431
 
431
432
  /* Fills */
432
433
  --fill-primary: var(--shade-lighter);