@citizenplane/pimp 8.11.2 → 8.12.0

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 (52) hide show
  1. package/README.md +0 -2
  2. package/dist/pimp.es.js +1146 -1139
  3. package/dist/pimp.umd.js +3 -3
  4. package/dist/style.css +1 -1
  5. package/package.json +26 -4
  6. package/src/README.md +0 -25
  7. package/src/assets/styles/base/_base.scss +1 -5
  8. package/src/assets/styles/utilities/_index.scss +19 -0
  9. package/src/components/core/BaseInputLabel.vue +0 -2
  10. package/src/components/date-pickers/CpDate.vue +8 -5
  11. package/src/components/inputs/CpInput.vue +5 -16
  12. package/src/components/inputs/CpTextarea.vue +4 -6
  13. package/src/components/selects/CpSelect.vue +5 -5
  14. package/src/stories/BaseInputLabel.stories.ts +35 -0
  15. package/src/stories/CpAlert.stories.ts +90 -0
  16. package/src/stories/CpBadge.stories.ts +158 -0
  17. package/src/stories/CpButton.stories.ts +134 -0
  18. package/src/stories/CpCheckbox.stories.ts +184 -0
  19. package/src/stories/CpDate.stories.ts +110 -0
  20. package/src/stories/CpDatepicker.stories.ts +162 -0
  21. package/src/stories/CpDialog.stories.ts +53 -0
  22. package/src/stories/CpHeading.stories.ts +77 -0
  23. package/src/stories/CpIcon.stories.ts +79 -0
  24. package/src/stories/CpInput.stories.ts +155 -0
  25. package/src/stories/CpLoader.stories.ts +29 -0
  26. package/src/stories/CpRadio.stories.ts +139 -0
  27. package/src/stories/CpSelect.stories.ts +147 -0
  28. package/src/stories/CpSelectMenu.stories.ts +132 -0
  29. package/src/stories/CpSwitch.stories.ts +137 -0
  30. package/src/stories/CpTable.stories.ts +192 -0
  31. package/src/stories/CpTableEmptyState.stories.ts +34 -0
  32. package/src/stories/CpTextarea.stories.ts +112 -0
  33. package/src/stories/CpToaster.stories.ts +147 -0
  34. package/src/stories/CpTooltip.stories.ts +101 -0
  35. package/src/stories/TransitionExpand.stories.ts +85 -0
  36. package/vitest.workspace.js +31 -0
  37. package/src/App.vue +0 -110
  38. package/src/components/core/playground-sections/SectionAtomicElements.vue +0 -83
  39. package/src/components/core/playground-sections/SectionButtons.vue +0 -142
  40. package/src/components/core/playground-sections/SectionContainer.vue +0 -50
  41. package/src/components/core/playground-sections/SectionDatePickers.vue +0 -160
  42. package/src/components/core/playground-sections/SectionDialog.vue +0 -47
  43. package/src/components/core/playground-sections/SectionFeedbackIndicators.vue +0 -47
  44. package/src/components/core/playground-sections/SectionInputs.vue +0 -46
  45. package/src/components/core/playground-sections/SectionListsAndTables.vue +0 -268
  46. package/src/components/core/playground-sections/SectionSelectMenus.vue +0 -98
  47. package/src/components/core/playground-sections/SectionSelects.vue +0 -120
  48. package/src/components/core/playground-sections/SectionSimpleInputs.vue +0 -305
  49. package/src/components/core/playground-sections/SectionToasters.vue +0 -68
  50. package/src/components/core/playground-sections/SectionToggles.vue +0 -158
  51. package/src/components/core/playground-sections/SectionTypography.vue +0 -40
  52. package/src/main.js +0 -15
@@ -0,0 +1,162 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import { ref } from 'vue'
3
+ import CpDatepicker from '@/components/date-pickers/CpDatepicker.vue'
4
+
5
+ const meta = {
6
+ title: 'CpDatepicker',
7
+ component: CpDatepicker,
8
+
9
+ argTypes: {
10
+ mode: {
11
+ control: 'select',
12
+ options: ['single', 'range'],
13
+ description: 'Selection mode: single date or date range',
14
+ },
15
+ closeAfterSelect: {
16
+ control: 'boolean',
17
+ description: 'Whether to close the picker after selection',
18
+ },
19
+ label: {
20
+ control: 'text',
21
+ description: 'Label text for the datepicker',
22
+ },
23
+ placeholder: {
24
+ control: 'text',
25
+ description: 'Placeholder text for the input',
26
+ },
27
+ isError: {
28
+ control: 'boolean',
29
+ description: 'Whether the field is in an invalid state',
30
+ },
31
+ errorMessage: {
32
+ control: 'text',
33
+ description: 'Custom error message to display',
34
+ },
35
+ initDateOne: {
36
+ control: 'text',
37
+ description: 'Initial first date (YYYY-MM-DD)',
38
+ },
39
+ initDateTwo: {
40
+ control: 'text',
41
+ description: 'Initial second date for range mode (YYYY-MM-DD)',
42
+ },
43
+ minDate: {
44
+ control: 'text',
45
+ description: 'Minimum allowed date',
46
+ },
47
+ maxDate: {
48
+ control: 'text',
49
+ description: 'Maximum allowed date',
50
+ },
51
+ allowPastDates: {
52
+ control: 'boolean',
53
+ description: 'Whether to allow selecting past dates',
54
+ },
55
+ isInline: {
56
+ control: 'boolean',
57
+ description: 'Whether to display the picker inline',
58
+ },
59
+ singleMonth: {
60
+ control: 'boolean',
61
+ description: 'Whether to show only one month',
62
+ },
63
+ locale: {
64
+ control: 'text',
65
+ description: 'Locale for date formatting',
66
+ },
67
+ },
68
+ } satisfies Meta<typeof CpDatepicker>
69
+
70
+ export default meta
71
+ type Story = StoryObj<typeof meta>
72
+
73
+ const defaultTemplate = `
74
+ <div style="height: 35vh; max-width: 600px; padding: 20px;">
75
+ <CpDatepicker
76
+ v-bind="args"
77
+ @dates="(selectedDates) => dates = selectedDates"
78
+ />
79
+ </div>
80
+ `
81
+
82
+ export const Default: Story = {
83
+ args: {
84
+ mode: 'single',
85
+ label: 'Select Date',
86
+ placeholder: 'Choose a date',
87
+ closeAfterSelect: true,
88
+ allowPastDates: false,
89
+ isInline: false,
90
+ singleMonth: false,
91
+ },
92
+ render: (args) => ({
93
+ components: { CpDatepicker },
94
+ setup() {
95
+ const dates = ref([])
96
+ return { args, dates }
97
+ },
98
+ template: defaultTemplate,
99
+ }),
100
+ }
101
+
102
+ export const DateRange: Story = {
103
+ args: {
104
+ ...Default.args,
105
+ mode: 'range',
106
+ label: 'Select Date Range',
107
+ placeholder: 'Choose date range',
108
+ },
109
+ render: (args) => ({
110
+ ...Default.render(args),
111
+ template: defaultTemplate,
112
+ }),
113
+ }
114
+
115
+ export const WithError: Story = {
116
+ args: {
117
+ ...Default.args,
118
+ label: 'Datepicker with Error',
119
+ isError: true,
120
+ errorMessage: 'Please select a valid date',
121
+ },
122
+ render: (args) => ({
123
+ ...Default.render(args),
124
+ template: defaultTemplate,
125
+ }),
126
+ }
127
+
128
+ export const WithInitialDates: Story = {
129
+ args: {
130
+ ...Default.args,
131
+ initDateOne: '2024-03-15',
132
+ label: 'Datepicker with Initial Date',
133
+ },
134
+ render: (args) => ({
135
+ ...Default.render(args),
136
+ template: defaultTemplate,
137
+ }),
138
+ }
139
+
140
+ export const SingleMonth: Story = {
141
+ args: {
142
+ ...Default.args,
143
+ singleMonth: true,
144
+ label: 'Single Month View',
145
+ },
146
+ render: (args) => ({
147
+ ...Default.render(args),
148
+ template: defaultTemplate,
149
+ }),
150
+ }
151
+
152
+ export const AllowPastDates: Story = {
153
+ args: {
154
+ ...Default.args,
155
+ allowPastDates: true,
156
+ label: 'Allow Past Dates',
157
+ },
158
+ render: (args) => ({
159
+ ...Default.render(args),
160
+ template: defaultTemplate,
161
+ }),
162
+ }
@@ -0,0 +1,53 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import { ref } from 'vue'
3
+
4
+ import CpDialog from '@/components/atomic-elements/CpDialog.vue'
5
+
6
+ const meta = {
7
+ title: 'CpDialog',
8
+ component: CpDialog,
9
+ argTypes: {
10
+ maxWidth: {
11
+ control: 'number',
12
+ description: 'The maximum width of the dialog',
13
+ },
14
+ onClose: { action: 'closed' },
15
+ },
16
+ parameters: {
17
+ styles: {
18
+ '.header': {
19
+ color: 'red',
20
+ },
21
+ },
22
+ },
23
+ } satisfies Meta<typeof CpDialog>
24
+
25
+ export default meta
26
+ type Story = StoryObj<typeof meta>
27
+
28
+ export const Default: Story = {
29
+ args: {
30
+ maxWidth: 600,
31
+ },
32
+ render: (args) => ({
33
+ setup() {
34
+ const isOpen = ref(false)
35
+ return { args, isOpen }
36
+ },
37
+ template: `
38
+ <CpButton @click="isOpen = true">Open Dialog</CpButton>
39
+ <CpDialogWrapper>
40
+ <CpDialog v-bind="args" v-if="isOpen" @close="isOpen = false">
41
+ <template #header>
42
+ <h1 style="padding: 16px 24px">Header slot</h1>
43
+ </template>
44
+ <p style="padding: 16px 24px">This is the default slot content. You can put any content here.</p>
45
+ <template #footer>
46
+ <CpButton @click="isOpen = false">Cancel</CpButton>
47
+ This is the footer slot
48
+ </template>
49
+ </CpDialog>
50
+ </CpDialogWrapper>
51
+ `,
52
+ }),
53
+ }
@@ -0,0 +1,77 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import CpHeading from '@/components/typography/CpHeading.vue'
3
+
4
+ const meta = {
5
+ title: 'CpHeading',
6
+ component: CpHeading,
7
+ argTypes: {
8
+ headingLevel: {
9
+ control: 'select',
10
+ options: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
11
+ description: 'HTML heading level',
12
+ },
13
+ size: {
14
+ control: 'select',
15
+ options: [100, 200, 300, 400, 500, 600, 700, 800, 900],
16
+ description: 'Size variant of the heading',
17
+ },
18
+ },
19
+ } satisfies Meta<typeof CpHeading>
20
+
21
+ export default meta
22
+ type Story = StoryObj<typeof meta>
23
+
24
+ export const Default: Story = {
25
+ args: {
26
+ headingLevel: 'h1',
27
+ size: 500,
28
+ },
29
+ render: (args) => ({
30
+ components: { CpHeading },
31
+ setup() {
32
+ return { args }
33
+ },
34
+ template: `
35
+ <div style="padding: 20px;">
36
+ <CpHeading v-bind="args">
37
+ Default Heading
38
+ </CpHeading>
39
+ </div>
40
+ `,
41
+ }),
42
+ }
43
+
44
+ export const AllSizes: Story = {
45
+ render: () => ({
46
+ components: { CpHeading },
47
+ template: `
48
+ <div style="padding: 20px; display: flex; flex-direction: column; gap: 16px;">
49
+ <CpHeading size="100">Size 100 Heading</CpHeading>
50
+ <CpHeading size="200">Size 200 Heading</CpHeading>
51
+ <CpHeading size="300">Size 300 Heading</CpHeading>
52
+ <CpHeading size="400">Size 400 Heading</CpHeading>
53
+ <CpHeading size="500">Size 500 Heading</CpHeading>
54
+ <CpHeading size="600">Size 600 Heading</CpHeading>
55
+ <CpHeading size="700">Size 700 Heading</CpHeading>
56
+ <CpHeading size="800">Size 800 Heading</CpHeading>
57
+ <CpHeading size="900">Size 900 Heading</CpHeading>
58
+ </div>
59
+ `,
60
+ }),
61
+ }
62
+
63
+ export const SizeAndLevelCombination: Story = {
64
+ render: () => ({
65
+ components: { CpHeading },
66
+ template: `
67
+ <div style="padding: 20px; display: flex; flex-direction: column; gap: 16px;">
68
+ <CpHeading heading-level="h1" size="900">H1 with Size 900</CpHeading>
69
+ <CpHeading heading-level="h2" size="800">H2 with Size 800</CpHeading>
70
+ <CpHeading heading-level="h3" size="700">H3 with Size 700</CpHeading>
71
+ <CpHeading heading-level="h4" size="600">H4 with Size 600</CpHeading>
72
+ <CpHeading heading-level="h5" size="500">H5 with Size 500</CpHeading>
73
+ <CpHeading heading-level="h6" size="400">H6 with Size 400</CpHeading>
74
+ </div>
75
+ `,
76
+ }),
77
+ }
@@ -0,0 +1,79 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import CpIcon from '@/components/visual/CpIcon.vue'
3
+
4
+ const meta = {
5
+ title: 'CpIcon',
6
+ component: CpIcon,
7
+ argTypes: {
8
+ type: {
9
+ control: 'select',
10
+ options: [
11
+ 'activity',
12
+ 'alert-circle',
13
+ 'arrow-down',
14
+ 'arrow-left',
15
+ 'arrow-right',
16
+ 'arrow-up',
17
+ 'bell',
18
+ 'calendar',
19
+ 'check',
20
+ 'check-circle',
21
+ 'chevron-down',
22
+ 'chevron-left',
23
+ 'chevron-right',
24
+ 'chevron-up',
25
+ 'edit',
26
+ 'home',
27
+ 'search',
28
+ 'settings',
29
+ 'user',
30
+ 'x',
31
+ ],
32
+ description: 'Type of icon to display',
33
+ },
34
+ size: {
35
+ control: 'number',
36
+ description: 'Size of the icon in pixels',
37
+ },
38
+ tag: {
39
+ control: 'text',
40
+ description: 'HTML tag to use for the icon wrapper',
41
+ },
42
+ },
43
+ } satisfies Meta<typeof CpIcon>
44
+
45
+ export default meta
46
+ type Story = StoryObj<typeof meta>
47
+
48
+ export const Default: Story = {
49
+ args: {
50
+ type: 'check',
51
+ size: 24,
52
+ tag: 'i',
53
+ },
54
+ render: (args) => ({
55
+ components: { CpIcon },
56
+ setup() {
57
+ return { args }
58
+ },
59
+ template: `
60
+ <div style="padding: 20px;">
61
+ <CpIcon v-bind="args" />
62
+ </div>
63
+ `,
64
+ }),
65
+ }
66
+
67
+ export const DifferentSizes: Story = {
68
+ render: () => ({
69
+ components: { CpIcon },
70
+ template: `
71
+ <div style="padding: 20px; display: flex; align-items: center; gap: 16px;">
72
+ <CpIcon type="check" size="16" />
73
+ <CpIcon type="check" size="24" />
74
+ <CpIcon type="check" size="32" />
75
+ <CpIcon type="check" size="48" />
76
+ </div>
77
+ `,
78
+ }),
79
+ }
@@ -0,0 +1,155 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import { ref } from 'vue'
3
+ import CpInput from '@/components/inputs/CpInput.vue'
4
+
5
+ const meta = {
6
+ title: 'CpInput',
7
+ component: CpInput,
8
+ argTypes: {
9
+ modelValue: {
10
+ control: 'text',
11
+ description: 'The input value',
12
+ },
13
+ type: {
14
+ control: 'select',
15
+ options: ['text', 'email', 'password', 'number', 'tel', 'url'],
16
+ description: 'The type of input',
17
+ },
18
+ label: {
19
+ control: 'text',
20
+ description: 'Label text for the input',
21
+ },
22
+ placeholder: {
23
+ control: 'text',
24
+ description: 'Placeholder text',
25
+ },
26
+ required: {
27
+ control: 'boolean',
28
+ description: 'Whether the field is required',
29
+ },
30
+ disabled: {
31
+ control: 'boolean',
32
+ description: 'Whether the field is disabled',
33
+ },
34
+ isInvalid: {
35
+ control: 'boolean',
36
+ description: 'Whether the field is in an invalid state',
37
+ },
38
+ errorMessage: {
39
+ control: 'text',
40
+ description: 'Error message to display',
41
+ },
42
+ autocomplete: {
43
+ control: 'text',
44
+ description: 'Autocomplete attribute value',
45
+ },
46
+ },
47
+ } satisfies Meta<typeof CpInput>
48
+
49
+ export default meta
50
+ type Story = StoryObj<typeof meta>
51
+
52
+ export const Default: Story = {
53
+ args: {
54
+ label: 'Input Label',
55
+ placeholder: 'Enter text here',
56
+ type: 'text',
57
+ required: false,
58
+ disabled: false,
59
+ autocomplete: 'off',
60
+ isInvalid: false,
61
+ errorMessage: '',
62
+ hideInvalidityIcon: false,
63
+ removeBorder: false,
64
+ isLarge: false,
65
+ isSearch: false,
66
+ help: '',
67
+ },
68
+ render: (args) => ({
69
+ components: { CpInput },
70
+ setup() {
71
+ const value = ref('')
72
+ return { args, value }
73
+ },
74
+ template: `
75
+ <div style="max-width: 400px; padding: 20px;">
76
+ <CpInput
77
+ v-model="value"
78
+ v-bind="args"
79
+ />
80
+ </div>
81
+ `,
82
+ }),
83
+ }
84
+
85
+ export const WithError: Story = {
86
+ args: {
87
+ ...Default.args,
88
+ isInvalid: true,
89
+ errorMessage: 'This field is required',
90
+ },
91
+ }
92
+
93
+ export const Required: Story = {
94
+ args: {
95
+ ...Default.args,
96
+ required: true,
97
+ },
98
+ }
99
+
100
+ export const Disabled: Story = {
101
+ args: {
102
+ ...Default.args,
103
+ disabled: true,
104
+ },
105
+ }
106
+
107
+ export const Email: Story = {
108
+ args: {
109
+ ...Default.args,
110
+ type: 'email',
111
+ label: 'Email Address',
112
+ placeholder: 'Enter your email',
113
+ },
114
+ }
115
+
116
+ export const Password: Story = {
117
+ args: {
118
+ ...Default.args,
119
+ type: 'password',
120
+ label: 'Password',
121
+ placeholder: 'Enter your password',
122
+ },
123
+ }
124
+
125
+ export const Number: Story = {
126
+ args: {
127
+ ...Default.args,
128
+ type: 'number',
129
+ label: 'Amount',
130
+ placeholder: 'Enter amount',
131
+ },
132
+ }
133
+
134
+ export const HelpAndTooltip: Story = {
135
+ args: {
136
+ ...Default.args,
137
+ help: 'This is a help text',
138
+ tooltip: 'This is a tooltip',
139
+ },
140
+ }
141
+
142
+ export const Search: Story = {
143
+ args: {
144
+ ...Default.args,
145
+ isSearch: true,
146
+ },
147
+ }
148
+
149
+ export const Mask: Story = {
150
+ args: {
151
+ ...Default.args,
152
+ placeholder: 'Enter your phone number',
153
+ mask: '## ## ## ## ##',
154
+ },
155
+ }
@@ -0,0 +1,29 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import CpLoader from '@/components/feedback-indicators/CpLoader.vue'
3
+
4
+ const meta = {
5
+ title: 'CpLoader',
6
+ component: CpLoader,
7
+ argTypes: {
8
+ color: {
9
+ control: 'color',
10
+ description: 'The color of the loader',
11
+ },
12
+ },
13
+ } satisfies Meta<typeof CpLoader>
14
+
15
+ export default meta
16
+ type Story = StoryObj<typeof meta>
17
+
18
+ export const Default: Story = {
19
+ args: {
20
+ color: '#4F46E5',
21
+ },
22
+ }
23
+
24
+ export const CustomColor: Story = {
25
+ args: {
26
+ ...Default.args,
27
+ color: '#10B981',
28
+ },
29
+ }
@@ -0,0 +1,139 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import { ref } from 'vue'
3
+ import CpRadio from '@/components/toggles/CpRadio.vue'
4
+
5
+ const meta = {
6
+ title: 'CpRadio',
7
+ component: CpRadio,
8
+ argTypes: {
9
+ modelValue: {
10
+ control: 'text',
11
+ description: 'The selected radio value',
12
+ },
13
+ options: {
14
+ control: 'object',
15
+ description: 'Array of radio options',
16
+ },
17
+ groupName: {
18
+ control: 'text',
19
+ description: 'Name attribute for radio group',
20
+ },
21
+ color: {
22
+ control: 'select',
23
+ options: ['blue', 'purple'],
24
+ description: 'Color variant of the radio',
25
+ },
26
+ autofocus: {
27
+ control: 'boolean',
28
+ description: 'Whether to autofocus the first radio',
29
+ },
30
+ },
31
+ } satisfies Meta<typeof CpRadio>
32
+
33
+ export default meta
34
+ type Story = StoryObj<typeof meta>
35
+
36
+ const sampleOptions = [
37
+ { value: 'option1', label: 'Option 1' },
38
+ { value: 'option2', label: 'Option 2' },
39
+ { value: 'option3', label: 'Option 3' },
40
+ ]
41
+
42
+ export const Default: Story = {
43
+ args: {
44
+ modelValue: 'option1',
45
+ options: sampleOptions,
46
+ groupName: 'radio-group',
47
+ color: 'blue',
48
+ autofocus: false,
49
+ },
50
+ render: (args) => ({
51
+ components: { CpRadio },
52
+ setup() {
53
+ const value = ref(args.modelValue)
54
+ return { args, value }
55
+ },
56
+ template: `
57
+ <div style="min-width: 400px; padding: 20px;">
58
+ <CpRadio
59
+ v-model="value"
60
+ v-bind="args"
61
+ />
62
+ </div>
63
+ `,
64
+ }),
65
+ }
66
+
67
+ export const WithDescriptions: Story = {
68
+ args: {
69
+ ...Default.args,
70
+ options: [
71
+ { value: 'option1', label: 'Basic Plan', description: 'Perfect for individuals' },
72
+ { value: 'option2', label: 'Pro Plan', description: 'Great for small teams' },
73
+ { value: 'option3', label: 'Enterprise Plan', description: 'For large organizations' },
74
+ ],
75
+ },
76
+ }
77
+
78
+ export const WithAdditionalData: Story = {
79
+ args: {
80
+ ...Default.args,
81
+ options: [
82
+ { value: 'option1', label: 'Monthly', additionalData: '$10/mo' },
83
+ { value: 'option2', label: 'Yearly', additionalData: '$100/yr' },
84
+ { value: 'option3', label: 'Lifetime', additionalData: '$500' },
85
+ ],
86
+ },
87
+ }
88
+
89
+ export const WithDisabledOptions: Story = {
90
+ args: {
91
+ ...Default.args,
92
+ options: [
93
+ { value: 'option1', label: 'Option 1' },
94
+ { value: 'option2', label: 'Option 2', disabled: true },
95
+ { value: 'option3', label: 'Option 3' },
96
+ ],
97
+ },
98
+ render: (args) => ({
99
+ components: { CpRadio },
100
+ setup() {
101
+ const value = ref(args.modelValue)
102
+ return { args, value }
103
+ },
104
+ template: `
105
+ <div style="min-width: 400px; padding: 20px;">
106
+ <CpRadio
107
+ v-model="value"
108
+ v-bind="args"
109
+ />
110
+ </div>
111
+ `,
112
+ }),
113
+ }
114
+
115
+ export const ComplexOptions: Story = {
116
+ args: {
117
+ ...Default.args,
118
+ options: [
119
+ {
120
+ value: 'option1',
121
+ label: 'Basic Plan',
122
+ description: 'Perfect for individuals',
123
+ additionalData: '$10/mo',
124
+ },
125
+ {
126
+ value: 'option2',
127
+ label: 'Pro Plan',
128
+ description: 'Great for small teams',
129
+ additionalData: '$30/mo',
130
+ },
131
+ {
132
+ value: 'option3',
133
+ label: 'Enterprise Plan',
134
+ description: 'For large organizations',
135
+ additionalData: '$100/mo',
136
+ },
137
+ ],
138
+ },
139
+ }