@youcan/celeste 0.6.40 → 0.6.41

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 (84) hide show
  1. package/dist/celeste.css +123 -9
  2. package/dist/cjs/chunks/index.js +211 -0
  3. package/dist/cjs/chunks/radio-group-item.vue_vue_type_style_index_0_lang.js +34 -0
  4. package/dist/cjs/chunks/radio-group.vue_vue_type_style_index_0_lang.js +39 -0
  5. package/dist/cjs/index.js +6 -0
  6. package/dist/cjs/modal-content.js +1 -1
  7. package/dist/cjs/radio-group-item.js +3 -0
  8. package/dist/cjs/radio-group.js +3 -0
  9. package/dist/cjs/tag.js +39 -0
  10. package/dist/components/index.d.ts +1 -0
  11. package/dist/components/radio-group/index.d.ts +4 -0
  12. package/dist/components/radio-group/radio-group-item.d.ts +7 -0
  13. package/dist/components/radio-group/radio-group.d.ts +26 -0
  14. package/dist/components/tag/index.d.ts +2 -0
  15. package/dist/components/tag/tag.d.ts +26 -0
  16. package/dist/es/button.js +1 -1
  17. package/dist/es/checkbox-label.js +1 -1
  18. package/dist/es/chunks/index.js +275 -64
  19. package/dist/es/chunks/index3.js +1 -1
  20. package/dist/es/chunks/radio-group-item.vue_vue_type_style_index_0_lang.js +35 -0
  21. package/dist/es/chunks/radio-group.vue_vue_type_style_index_0_lang.js +40 -0
  22. package/dist/es/combobox-group.js +1 -1
  23. package/dist/es/combobox-input.js +1 -1
  24. package/dist/es/combobox-item.js +1 -1
  25. package/dist/es/combobox-list.js +1 -1
  26. package/dist/es/combobox-root.js +1 -1
  27. package/dist/es/combobox-separator.js +1 -1
  28. package/dist/es/combobox-trigger.js +1 -1
  29. package/dist/es/command-group.js +1 -1
  30. package/dist/es/command-input.js +1 -1
  31. package/dist/es/command-item.js +1 -1
  32. package/dist/es/command-list.js +1 -1
  33. package/dist/es/command-root.js +1 -1
  34. package/dist/es/command-separator.js +1 -1
  35. package/dist/es/compact-button.js +1 -1
  36. package/dist/es/digit-input-group.js +1 -1
  37. package/dist/es/digit-input-slot.js +1 -1
  38. package/dist/es/digit-input.js +1 -1
  39. package/dist/es/dropdown-menu-content.js +1 -1
  40. package/dist/es/dropdown-menu-group.js +1 -1
  41. package/dist/es/dropdown-menu-item.js +1 -1
  42. package/dist/es/dropdown-menu-label.js +1 -1
  43. package/dist/es/dropdown-menu-separator.js +1 -1
  44. package/dist/es/dropdown-menu-sub-content.js +1 -1
  45. package/dist/es/dropdown-menu-sub-trigger.js +1 -1
  46. package/dist/es/dropdown-menu-trigger.js +1 -1
  47. package/dist/es/dropdown-menu.js +1 -1
  48. package/dist/es/dropdown.js +1 -1
  49. package/dist/es/fancy-button.js +1 -1
  50. package/dist/es/index.js +24 -18
  51. package/dist/es/label.js +1 -1
  52. package/dist/es/link-button.js +1 -1
  53. package/dist/es/modal-content.js +2 -2
  54. package/dist/es/modal-header.js +1 -1
  55. package/dist/es/popover-content.js +1 -1
  56. package/dist/es/popover-trigger.js +1 -1
  57. package/dist/es/progress-bar.js +1 -1
  58. package/dist/es/progress-circle.js +1 -1
  59. package/dist/es/radio-group-item.js +4 -0
  60. package/dist/es/radio-group.js +4 -0
  61. package/dist/es/segmented-control-item.js +1 -1
  62. package/dist/es/segmented-control.js +1 -1
  63. package/dist/es/select-content.js +1 -1
  64. package/dist/es/select-item.js +1 -1
  65. package/dist/es/select-trigger.js +1 -1
  66. package/dist/es/select-value.js +1 -1
  67. package/dist/es/social-button.js +1 -1
  68. package/dist/es/tab-menu-content.js +1 -1
  69. package/dist/es/tab-menu-item.js +1 -1
  70. package/dist/es/tab-menu-list.js +1 -1
  71. package/dist/es/tab-menu.js +1 -1
  72. package/dist/es/tag.js +40 -0
  73. package/dist/es/text-input.js +1 -1
  74. package/dist/es/tooltip.js +1 -1
  75. package/package.json +3 -4
  76. package/src/components/index.ts +1 -0
  77. package/src/components/modal/modal-content.vue +2 -2
  78. package/src/components/radio-group/index.ts +5 -0
  79. package/src/components/radio-group/radio-group-item.vue +83 -0
  80. package/src/components/radio-group/radio-group.vue +30 -0
  81. package/src/components/radio-group/stories/radio-group.stories.ts +48 -0
  82. package/src/components/tag/index.ts +2 -0
  83. package/src/components/tag/stories/tag.stories.ts +162 -0
  84. package/src/components/tag/tag.vue +125 -0
@@ -0,0 +1,48 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import RadioGroupItem from '../radio-group-item.vue';
3
+ import RadioGroup from '../radio-group.vue';
4
+
5
+ const meta: Meta<typeof RadioGroup> = {
6
+ title: 'Components/Radio Group',
7
+ component: RadioGroup,
8
+ };
9
+
10
+ export default meta;
11
+
12
+ type Story = StoryObj<typeof RadioGroup>;
13
+
14
+ export const Default: Story = {
15
+ args: {
16
+ defaultValue: 'option2',
17
+ orientation: 'vertical',
18
+ disabled: false,
19
+ name: 'radio-group',
20
+ modelValue: '',
21
+ dir: 'ltr',
22
+ loop: true,
23
+ required: true,
24
+ },
25
+
26
+ render: args => ({
27
+ components: { RadioGroup, RadioGroupItem },
28
+ setup() {
29
+ return { args };
30
+ },
31
+ template: `
32
+ <RadioGroup v-bind="args" v-model="option2" style="display: flex; gap: 20px;">
33
+ <div style="display: flex; align-items: center;">
34
+ <RadioGroupItem id="r1" value="option1"></RadioGroupItem>
35
+ <label for="r1" style="padding-inline-start: 10px;">Option 1</label>
36
+ </div>
37
+ <div style="display: flex; align-items: center;">
38
+ <RadioGroupItem id="r2" value="option2"></RadioGroupItem>
39
+ <label for="r2" style="padding-inline-start: 10px;">Option 2</label>
40
+ </div>
41
+ <div style="display: flex; align-items: center;">
42
+ <RadioGroupItem id="r3" value="option3"></RadioGroupItem>
43
+ <label for="r3" style="padding-inline-start: 10px;">Option 3</label>
44
+ </div>
45
+ </RadioGroup>
46
+ `,
47
+ }),
48
+ };
@@ -0,0 +1,2 @@
1
+ export * from './tag.vue';
2
+ export { default as Tag } from './tag.vue';
@@ -0,0 +1,162 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3-vite';
2
+ import { ref } from 'vue';
3
+ import Tag from '../tag.vue';
4
+
5
+ const meta: Meta<typeof Tag> = {
6
+ title: 'Components/Tag',
7
+ component: Tag,
8
+ parameters: {
9
+ layout: 'centered',
10
+ },
11
+ argTypes: {
12
+ variant: {
13
+ control: { type: 'select' },
14
+ options: ['stroke', 'gray'],
15
+ description: 'Visual variant of the tag',
16
+ },
17
+ dismissable: {
18
+ control: { type: 'boolean' },
19
+ description: 'Whether the tag can be dismissed with a close button',
20
+ },
21
+ disabled: {
22
+ control: { type: 'boolean' },
23
+ description: 'Whether the tag is in a disabled state',
24
+ },
25
+ class: {
26
+ control: { type: 'text' },
27
+ description: 'Additional CSS classes to apply',
28
+ },
29
+ onDismiss: {
30
+ action: 'dismiss',
31
+ description: 'Event emitted when the dismiss button is clicked',
32
+ },
33
+ },
34
+ args: {
35
+ variant: 'stroke',
36
+ dismissable: false,
37
+ disabled: false,
38
+ },
39
+ };
40
+
41
+ export default meta;
42
+ type Story = StoryObj<typeof Tag>;
43
+
44
+ export const Default: Story = {
45
+ args: {},
46
+ render: args => ({
47
+ components: { Tag },
48
+ setup() {
49
+ return { args };
50
+ },
51
+ template: `
52
+ <Tag v-bind="args">
53
+ Tag
54
+ </Tag>
55
+ `,
56
+ }),
57
+ };
58
+
59
+ export const Variants: Story = {
60
+ render: () => ({
61
+ components: { Tag },
62
+ template: `
63
+ <div style="display: flex; gap: 12px; align-items: center;">
64
+ <Tag variant="stroke">Stroke Variant</Tag>
65
+ <Tag variant="gray">Gray Variant</Tag>
66
+ </div>
67
+ `,
68
+ }),
69
+ };
70
+
71
+ export const Dismissable: Story = {
72
+ render: args => ({
73
+ components: { Tag },
74
+ setup() {
75
+ function handleDismiss(): void {};
76
+ return { args, handleDismiss };
77
+ },
78
+ template: `
79
+ <div style="display: flex; gap: 12px; align-items: center;">
80
+ <Tag variant="stroke" dismissable @dismiss="handleDismiss">Dismissable Stroke</Tag>
81
+ <Tag variant="gray" dismissable @dismiss="handleDismiss">Dismissable Gray</Tag>
82
+ </div>
83
+ `,
84
+ }),
85
+ args: {
86
+ dismissable: true,
87
+ },
88
+ };
89
+
90
+ export const Disabled: Story = {
91
+ render: () => ({
92
+ components: { Tag },
93
+ template: `
94
+ <div style="display: flex; gap: 12px; align-items: center;">
95
+ <Tag disabled variant="stroke">Disabled Stroke</Tag>
96
+ <Tag disabled variant="gray">Disabled Gray</Tag>
97
+ <Tag disabled dismissable variant="stroke">Disabled Dismissable</Tag>
98
+ </div>
99
+ `,
100
+ }),
101
+ };
102
+
103
+ export const TagList: Story = {
104
+ render: () => ({
105
+ components: { Tag },
106
+ setup() {
107
+ const tags = ref([
108
+ { id: 1, text: 'Facebook' },
109
+ { id: 2, text: 'Google Analytics' },
110
+ { id: 3, text: 'Snap' },
111
+ { id: 4, text: 'TikTok' },
112
+ ]);
113
+
114
+ const removeTag = (id: number): void => {
115
+ tags.value = tags.value.filter(tag => tag.id !== id);
116
+ };
117
+
118
+ return { tags, removeTag };
119
+ },
120
+ template: `
121
+ <div style="display: flex; gap: 8px; align-items: center; flex-wrap: wrap; min-height: 32px;">
122
+ <Tag
123
+ v-for="tag in tags"
124
+ :key="tag.id"
125
+ :variant="tag.variant"
126
+ dismissable
127
+ @dismiss="removeTag(tag.id)"
128
+ >
129
+ {{ tag.text }}
130
+ </Tag>
131
+ </div>
132
+ `,
133
+ }),
134
+ };
135
+
136
+ export const WithIcon: Story = {
137
+ render: () => ({
138
+ components: { Tag },
139
+ template: `
140
+ <Tag variant="stroke">
141
+ <i class="i-celeste-star-line" />
142
+ Star
143
+ </Tag>
144
+ `,
145
+ }),
146
+ };
147
+
148
+ export const WithImage: Story = {
149
+ render: () => ({
150
+ components: { Tag },
151
+ template: `
152
+ <Tag variant="stroke">
153
+ <img
154
+ width="16"
155
+ height="16"
156
+ style="object-fit: fill; clip-path: circle()"
157
+ src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/de/Flag_of_the_United_States.png/1024px-Flag_of_the_United_States.png" alt="USA" />
158
+ United States of America
159
+ </Tag>
160
+ `,
161
+ }),
162
+ };
@@ -0,0 +1,125 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue';
3
+ import clsx from 'clsx';
4
+
5
+ const props = withDefaults(defineProps<TagProps>(), {
6
+ variant: 'stroke',
7
+ dismissable: false,
8
+ });
9
+
10
+ defineEmits<TagEmits>();
11
+ </script>
12
+
13
+ <script lang="ts">
14
+ export interface TagProps {
15
+ variant?: 'stroke' | 'gray';
16
+ class?: HTMLAttributes['class'];
17
+ dismissable?: boolean;
18
+ disabled?: boolean;
19
+ }
20
+
21
+ export interface TagEmits {
22
+ dismiss: [];
23
+ }
24
+ </script>
25
+
26
+ <template>
27
+ <div
28
+ :class="clsx('celeste-tag', props.class)"
29
+ :data-tag-variant="variant"
30
+ :aria-disabled="disabled"
31
+ >
32
+ <slot />
33
+ <button
34
+ v-if="dismissable"
35
+ :disabled="disabled"
36
+ class="celeste-tag-dismiss-button"
37
+ aria-label="dismiss"
38
+ @click.prevent.stop="$emit('dismiss')"
39
+ >
40
+ <i class="i-celeste-close-line" />
41
+ </button>
42
+ </div>
43
+ </template>
44
+
45
+ <style scoped lang="scss">
46
+ .celeste-tag {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ padding: var(--spacing-4) var(--spacing-8);
51
+ transition: background-color, border-color;
52
+ transition-duration: var(--animation-fast);
53
+ transition-timing-function: ease-out;
54
+ border: 1px solid transparent;
55
+ border-radius: var(--radius-6);
56
+ color: var(--color-text-sub-600);
57
+ font: var(--label-xs);
58
+ gap: var(--spacing-4);
59
+
60
+ &[data-tag-variant='stroke']:not([aria-disabled='true']) {
61
+ border-color: var(--color-stroke-soft-200);
62
+ background-color: var(--color-bg-white-0);
63
+
64
+ &:hover {
65
+ border-color: transparent;
66
+ background-color: var(--color-bg-weak-50);
67
+ }
68
+ }
69
+
70
+ &[data-tag-variant='gray']:not([aria-disabled='true']) {
71
+ border-color: transparent;
72
+ background-color: var(--color-bg-weak-50);
73
+
74
+ &:hover {
75
+ border-color: var(--color-stroke-soft-200);
76
+ background-color: var(--color-bg-white-0);
77
+ }
78
+ }
79
+
80
+ .celeste-tag-dismiss-button {
81
+ --size: 16px;
82
+
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ width: var(--size);
87
+ height: var(--size);
88
+ margin-inline-end: calc(var(--spacing-4) * -1);
89
+ padding: var(--spacing-0);
90
+ border: none;
91
+ border-radius: calc(var(--radius-4) / 2);
92
+ background-color: transparent;
93
+ cursor: pointer;
94
+
95
+ i {
96
+ transition: background-color var(--animation-fast) ease-out;
97
+ background-color: var(--color-icon-soft-400);
98
+ }
99
+
100
+ &:disabled {
101
+ cursor: auto;
102
+
103
+ i {
104
+ background-color: var(--color-icon-disabled-300);
105
+ }
106
+ }
107
+
108
+ &:focus:not([aria-disabled='true']) {
109
+ outline: none;
110
+ box-shadow: var(--shadow-buttons-important-focus);
111
+ }
112
+
113
+ &:not(:disabled):hover {
114
+ i {
115
+ background-color: var(--color-icon-sub-600);
116
+ }
117
+ }
118
+ }
119
+
120
+ &[aria-disabled='true'] {
121
+ background-color: var(--color-bg-weak-50);
122
+ color: var(--color-text-disabled-300);
123
+ }
124
+ }
125
+ </style>