webcake-ui-kit 1.0.0 → 1.0.2

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 (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +358 -8
  3. package/package.json +68 -5
  4. package/src/components/accordion/Accordion.vue +70 -0
  5. package/src/components/accordion/accordion.css +5 -0
  6. package/src/components/accordion-item/AccordionItem.vue +98 -0
  7. package/src/components/accordion-item/accordion-item.css +143 -0
  8. package/src/components/alert-dialog/AlertDialog.vue +82 -0
  9. package/src/components/alert-dialog/alert-dialog.css +33 -0
  10. package/src/components/badge/Badge.vue +2 -2
  11. package/src/components/badge/badge.css +1 -4
  12. package/src/components/breadcrumb/Breadcrumb.vue +85 -0
  13. package/src/components/breadcrumb/breadcrumb.css +90 -0
  14. package/src/components/button/Button.vue +77 -10
  15. package/src/components/button/button.css +258 -24
  16. package/src/components/button-group/ButtonGroup.vue +25 -0
  17. package/src/components/button-group/button-group.css +30 -0
  18. package/src/components/checkbox/Checkbox.vue +55 -0
  19. package/src/components/checkbox/checkbox.css +86 -0
  20. package/src/components/checkbox-group/CheckboxGroup.vue +50 -0
  21. package/src/components/checkbox-group/checkbox-group.css +35 -0
  22. package/src/components/dialog/Dialog.vue +355 -0
  23. package/src/components/dialog/dialog.css +255 -0
  24. package/src/components/divider/Divider.vue +35 -0
  25. package/src/components/divider/divider.css +38 -0
  26. package/src/components/input/Input.vue +99 -0
  27. package/src/components/input/input.css +123 -0
  28. package/src/components/pagination/Pagination.vue +211 -0
  29. package/src/components/pagination/pagination.css +13 -0
  30. package/src/components/radio/Radio.vue +74 -0
  31. package/src/components/radio/radio.css +89 -0
  32. package/src/components/radio-group/RadioGroup.vue +70 -0
  33. package/src/components/radio-group/radio_group.css +11 -0
  34. package/src/components/rich-checkbox-group/RichCheckboxGroup.vue +59 -0
  35. package/src/components/rich-checkbox-group/rich-checkbox-group.css +54 -0
  36. package/src/components/rich-switch-group/RichSwitchGroup.vue +49 -0
  37. package/src/components/rich-switch-group/rich_switch_group.css +45 -0
  38. package/src/components/select/Select.vue +262 -0
  39. package/src/components/select/select.css +207 -0
  40. package/src/components/select-option/SelectOption.vue +82 -0
  41. package/src/components/select-option/select_option.css +60 -0
  42. package/src/components/sidebar-group-label/SidebarGroupLabel.vue +68 -0
  43. package/src/components/sidebar-group-label/sidebar_group_label.css +61 -0
  44. package/src/components/sidebar-item/SidebarItem.vue +110 -0
  45. package/src/components/sidebar-item/sidebar_item.css +142 -0
  46. package/src/components/slider/Slider.vue +255 -0
  47. package/src/components/slider/slider.css +89 -0
  48. package/src/components/spinner/Spinner.vue +47 -0
  49. package/src/components/spinner/spinner.css +48 -0
  50. package/src/components/switch/Switch.vue +32 -0
  51. package/src/components/switch/switch.css +46 -0
  52. package/src/components/switch-group/SwitchGroup.vue +32 -0
  53. package/src/components/switch-group/switch_group.css +28 -0
  54. package/src/components/tabs/Tabs.vue +57 -0
  55. package/src/components/tabs/tabs.css +118 -0
  56. package/src/components/tag/Tag.vue +47 -0
  57. package/src/components/tag/tag.css +115 -0
  58. package/src/components/toggle/Toggle.vue +112 -0
  59. package/src/components/toggle/toggle.css +174 -0
  60. package/src/components/toggle-group/ToggleGroup.vue +57 -0
  61. package/src/components/toggle-group/toggle-group.css +68 -0
  62. package/src/icons/LoaderIcon.vue +22 -0
  63. package/src/index.js +29 -2
  64. package/src/styles/.omc/state/agent-replay-645326b7-372b-463d-ab45-0adaafe31a51.jsonl +2 -0
  65. package/src/styles/.omc/state/subagent-tracking.json +7 -0
  66. package/src/styles/alpha_colors.css +35 -37
  67. package/src/styles/border_radius.css +21 -23
  68. package/src/styles/brand_colors.css +37 -39
  69. package/src/styles/chart_colors.css +27 -29
  70. package/src/styles/color_general.css +206 -201
  71. package/src/styles/raw_colors.css +267 -269
  72. package/src/styles/shadow.css +10 -12
  73. package/src/styles/spacing.css +31 -33
  74. package/src/styles/typography.css +76 -78
@@ -0,0 +1,82 @@
1
+ <template>
2
+ <div
3
+ class="ui-select-option"
4
+ :class="{
5
+ 'ui-select-option--selected': isSelected,
6
+ 'ui-select-option--disabled': isDisabled,
7
+ 'ui-select-option--large': size === 'large',
8
+ 'ui-select-option--destructive': variant === 'destructive'
9
+ }"
10
+ tabindex="0"
11
+ @click="handleClick"
12
+ @keydown.enter="handleClick"
13
+ @keydown.space.prevent="handleClick"
14
+ >
15
+ <slot>{{ label || value }}</slot>
16
+ </div>
17
+ </template>
18
+
19
+ <script>
20
+ export default {
21
+ name: 'SelectOption',
22
+
23
+ inject: {
24
+ select: { default: null }
25
+ },
26
+
27
+ props: {
28
+ value: {
29
+ type: String,
30
+ required: true
31
+ },
32
+ label: {
33
+ type: String,
34
+ default: ''
35
+ },
36
+ disabled: {
37
+ type: Boolean,
38
+ default: false
39
+ },
40
+ size: {
41
+ type: String,
42
+ default: 'regular',
43
+ validator: function (v) {
44
+ return ['regular', 'large'].indexOf(v) !== -1
45
+ }
46
+ },
47
+ variant: {
48
+ type: String,
49
+ default: 'default',
50
+ validator: function (v) {
51
+ return ['default', 'destructive'].indexOf(v) !== -1
52
+ }
53
+ }
54
+ },
55
+
56
+ emits: [],
57
+
58
+ mounted() {
59
+ if (this.select && this.select.registerOption) {
60
+ this.select.registerOption(this.value, this.label || this.value)
61
+ }
62
+ },
63
+
64
+ computed: {
65
+ isSelected() {
66
+ return this.select ? this.select.value === this.value : false
67
+ },
68
+ isDisabled() {
69
+ return this.disabled || (this.select ? this.select.disabled : false)
70
+ }
71
+ },
72
+
73
+ methods: {
74
+ handleClick() {
75
+ if (this.isDisabled || !this.select) return
76
+ this.select.select(this.value)
77
+ }
78
+ }
79
+ }
80
+ </script>
81
+
82
+ <style src="./select_option.css" scoped></style>
@@ -0,0 +1,60 @@
1
+ .ui-select-option {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: var(--spacing-xs);
5
+ min-height: 32px;
6
+ padding: var(--spacing-5p5) var(--spacing-xs);
7
+ border-radius: var(--radius);
8
+ font-family: var(--font-family-body);
9
+ font-size: var(--paragraph-small-font-size);
10
+ line-height: var(--paragraph-small-line-height);
11
+ font-weight: var(--paragraph-font-weight);
12
+ color: var(--primary-fg);
13
+ cursor: pointer;
14
+ transition: background 0.15s;
15
+ outline: none;
16
+ }
17
+
18
+ .ui-select-option:hover {
19
+ background: var(--accent-bg);
20
+ }
21
+
22
+ .ui-select-option:focus-visible {
23
+ background: var(--accent-bg);
24
+ box-shadow: 0 0 0 3px var(--ring);
25
+ }
26
+
27
+ .ui-select-option:active {
28
+ background: var(--accent-2);
29
+ }
30
+
31
+ .ui-select-option--selected {
32
+ background: var(--accent-2);
33
+ font-weight: var(--paragraph-medium-font-weight);
34
+ }
35
+
36
+ .ui-select-option--disabled {
37
+ opacity: 0.5;
38
+ cursor: not-allowed;
39
+ pointer-events: none;
40
+ }
41
+
42
+ .ui-select-option--large {
43
+ min-height: 36px;
44
+ padding: var(--spacing-7p5) var(--spacing-sm);
45
+ gap: var(--spacing-sm);
46
+ }
47
+
48
+ .ui-select-option--destructive {
49
+ color: var(--destructive-text);
50
+ }
51
+
52
+ .ui-select-option--destructive:hover,
53
+ .ui-select-option--destructive:active {
54
+ background: var(--negative-subtle);
55
+ }
56
+
57
+ .ui-select-option--destructive:focus-visible {
58
+ background: transparent;
59
+ box-shadow: 0 0 0 3px var(--ring);
60
+ }
@@ -0,0 +1,68 @@
1
+ <template>
2
+ <div
3
+ class="ui-sidebar-group-label"
4
+ :class="{
5
+ 'ui-sidebar-group-label--collapsible': collapsible,
6
+ 'ui-sidebar-group-label--collapsed': collapsible && !expanded
7
+ }"
8
+ >
9
+ <button
10
+ v-if="collapsible"
11
+ class="ui-sidebar-group-label__trigger"
12
+ :aria-expanded="String(expanded)"
13
+ @click="$emit('toggle')"
14
+ >
15
+ <span class="ui-sidebar-group-label__text"
16
+ ><slot>{{ label }}</slot></span
17
+ >
18
+ <span class="ui-sidebar-group-label__chevron" aria-hidden="true">
19
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none">
20
+ <path
21
+ d="M3 4.5L6 7.5L9 4.5"
22
+ stroke="currentColor"
23
+ stroke-width="1.5"
24
+ stroke-linecap="round"
25
+ stroke-linejoin="round"
26
+ />
27
+ </svg>
28
+ </span>
29
+ </button>
30
+ <span v-else class="ui-sidebar-group-label__text"
31
+ ><slot>{{ label }}</slot></span
32
+ >
33
+ <span v-if="hasActionSlot" class="ui-sidebar-group-label__action">
34
+ <slot name="action" />
35
+ </span>
36
+ </div>
37
+ </template>
38
+
39
+ <script>
40
+ export default {
41
+ name: 'SidebarGroupLabel',
42
+
43
+ props: {
44
+ label: {
45
+ type: String,
46
+ default: ''
47
+ },
48
+ collapsible: {
49
+ type: Boolean,
50
+ default: false
51
+ },
52
+ expanded: {
53
+ type: Boolean,
54
+ default: true
55
+ }
56
+ },
57
+
58
+ emits: ['toggle'],
59
+
60
+ computed: {
61
+ hasActionSlot() {
62
+ return !!((this.$scopedSlots && this.$scopedSlots['action']) || this.$slots['action'])
63
+ }
64
+ }
65
+ }
66
+ </script>
67
+
68
+ <style src="./sidebar_group_label.css" scoped></style>
@@ -0,0 +1,61 @@
1
+ .ui-sidebar-group-label {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: var(--spacing-2xs);
5
+ padding: var(--spacing-2xs) var(--spacing-xs);
6
+ margin-bottom: var(--spacing-3xs);
7
+ }
8
+
9
+ /* Collapsible: full-width trigger button */
10
+ .ui-sidebar-group-label__trigger {
11
+ flex: 1;
12
+ display: flex;
13
+ align-items: center;
14
+ gap: var(--spacing-2xs);
15
+ background: transparent;
16
+ border: none;
17
+ padding: 0;
18
+ cursor: pointer;
19
+ font-family: inherit;
20
+ min-width: 0;
21
+ }
22
+
23
+ .ui-sidebar-group-label__trigger:focus-visible {
24
+ outline: none;
25
+ border-radius: var(--radius-4);
26
+ box-shadow: 0 0 0 2px var(--sidebar-ring);
27
+ }
28
+
29
+ /* Label text (shared between trigger and plain span) */
30
+ .ui-sidebar-group-label__text {
31
+ flex: 1;
32
+ font-size: 12px;
33
+ font-weight: 500;
34
+ line-height: 16px;
35
+ letter-spacing: 0.04em;
36
+ text-transform: uppercase;
37
+ color: var(--sidebar-muted);
38
+ overflow: hidden;
39
+ text-overflow: ellipsis;
40
+ white-space: nowrap;
41
+ }
42
+
43
+ /* Chevron rotates on collapse */
44
+ .ui-sidebar-group-label__chevron {
45
+ flex-shrink: 0;
46
+ display: flex;
47
+ align-items: center;
48
+ color: var(--sidebar-muted);
49
+ transition: transform 0.2s ease;
50
+ }
51
+
52
+ .ui-sidebar-group-label--collapsed .ui-sidebar-group-label__chevron {
53
+ transform: rotate(-90deg);
54
+ }
55
+
56
+ /* Optional action slot (mini button) */
57
+ .ui-sidebar-group-label__action {
58
+ flex-shrink: 0;
59
+ display: flex;
60
+ align-items: center;
61
+ }
@@ -0,0 +1,110 @@
1
+ <template>
2
+ <button
3
+ class="ui-sidebar-item"
4
+ :class="{
5
+ 'ui-sidebar-item--active': active,
6
+ 'ui-sidebar-item--disabled': disabled,
7
+ 'ui-sidebar-item--large': size === 'large',
8
+ 'ui-sidebar-item--level-2': level === 2,
9
+ 'ui-sidebar-item--has-children': hasChildren,
10
+ 'ui-sidebar-item--expanded': hasChildren && expanded,
11
+ 'ui-sidebar-item--collapsed': collapsed
12
+ }"
13
+ :tabindex="disabled ? -1 : 0"
14
+ :aria-current="active ? 'page' : undefined"
15
+ :aria-disabled="disabled ? true : undefined"
16
+ :aria-expanded="hasChildren ? String(expanded) : undefined"
17
+ @click="handleClick"
18
+ >
19
+ <span v-if="hasIconSlot" class="ui-sidebar-item__icon" aria-hidden="true">
20
+ <slot name="icon" />
21
+ </span>
22
+ <span class="ui-sidebar-item__label">
23
+ <slot>{{ label }}</slot>
24
+ </span>
25
+ <span v-if="badge" class="ui-sidebar-item__badge">{{ badge }}</span>
26
+ <span v-if="hasChildren" class="ui-sidebar-item__chevron" aria-hidden="true">
27
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none">
28
+ <path
29
+ d="M3 4.5L6 7.5L9 4.5"
30
+ stroke="currentColor"
31
+ stroke-width="1.5"
32
+ stroke-linecap="round"
33
+ stroke-linejoin="round"
34
+ />
35
+ </svg>
36
+ </span>
37
+ </button>
38
+ </template>
39
+
40
+ <script>
41
+ export default {
42
+ name: 'SidebarItem',
43
+
44
+ props: {
45
+ label: {
46
+ type: String,
47
+ default: ''
48
+ },
49
+ active: {
50
+ type: Boolean,
51
+ default: false
52
+ },
53
+ disabled: {
54
+ type: Boolean,
55
+ default: false
56
+ },
57
+ size: {
58
+ type: String,
59
+ default: 'regular',
60
+ validator: function (v) {
61
+ return ['regular', 'large'].indexOf(v) !== -1
62
+ }
63
+ },
64
+ level: {
65
+ type: Number,
66
+ default: 1,
67
+ validator: function (v) {
68
+ return [1, 2].indexOf(v) !== -1
69
+ }
70
+ },
71
+ badge: {
72
+ type: String,
73
+ default: ''
74
+ },
75
+ hasChildren: {
76
+ type: Boolean,
77
+ default: false
78
+ },
79
+ expanded: {
80
+ type: Boolean,
81
+ default: false
82
+ },
83
+ collapsed: {
84
+ type: Boolean,
85
+ default: false
86
+ }
87
+ },
88
+
89
+ emits: ['click', 'toggle'],
90
+
91
+ computed: {
92
+ hasIconSlot() {
93
+ return !!((this.$scopedSlots && this.$scopedSlots['icon']) || this.$slots['icon'])
94
+ }
95
+ },
96
+
97
+ methods: {
98
+ handleClick() {
99
+ if (this.disabled) return
100
+ if (this.hasChildren) {
101
+ this.$emit('toggle')
102
+ } else {
103
+ this.$emit('click')
104
+ }
105
+ }
106
+ }
107
+ }
108
+ </script>
109
+
110
+ <style src="./sidebar_item.css" scoped></style>
@@ -0,0 +1,142 @@
1
+ .ui-sidebar-item {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: var(--spacing-xs);
5
+ width: 100%;
6
+ padding: var(--spacing-5) var(--spacing-xs);
7
+ border-radius: var(--radius-6);
8
+ color: var(--sidebar-foreground);
9
+ background: transparent;
10
+ border: none;
11
+ cursor: pointer;
12
+ font-family: inherit;
13
+ font-size: 14px;
14
+ line-height: 20px;
15
+ font-weight: 400;
16
+ text-align: left;
17
+ transition:
18
+ background-color 0.15s ease,
19
+ color 0.15s ease;
20
+ }
21
+
22
+ .ui-sidebar-item:hover {
23
+ background-color: var(--sidebar-accent);
24
+ color: var(--sidebar-accent-foreground);
25
+ }
26
+
27
+ .ui-sidebar-item:focus-visible {
28
+ outline: none;
29
+ box-shadow: 0 0 0 2px var(--sidebar-ring);
30
+ }
31
+
32
+ .ui-sidebar-item:active {
33
+ background-color: var(--sidebar-accent);
34
+ }
35
+
36
+ /* Active (selected page) */
37
+ .ui-sidebar-item--active {
38
+ background-color: var(--sidebar-accent);
39
+ color: var(--sidebar-primary);
40
+ font-weight: 500;
41
+ }
42
+
43
+ /* Disabled */
44
+ .ui-sidebar-item--disabled {
45
+ opacity: 0.5;
46
+ cursor: not-allowed;
47
+ pointer-events: none;
48
+ }
49
+
50
+ /* Large size */
51
+ .ui-sidebar-item--large {
52
+ padding-top: var(--spacing-xs);
53
+ padding-bottom: var(--spacing-xs);
54
+ font-size: 15px;
55
+ }
56
+
57
+ /* Level 2 — nested, indented */
58
+ .ui-sidebar-item--level-2 {
59
+ padding-left: var(--spacing-lg);
60
+ }
61
+
62
+ /* Icon */
63
+ .ui-sidebar-item__icon {
64
+ flex-shrink: 0;
65
+ width: 16px;
66
+ height: 16px;
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ color: var(--sidebar-muted);
71
+ }
72
+
73
+ .ui-sidebar-item--active .ui-sidebar-item__icon,
74
+ .ui-sidebar-item:hover .ui-sidebar-item__icon {
75
+ color: inherit;
76
+ }
77
+
78
+ /* Label */
79
+ .ui-sidebar-item__label {
80
+ flex: 1;
81
+ min-width: 0;
82
+ overflow: hidden;
83
+ text-overflow: ellipsis;
84
+ white-space: nowrap;
85
+ }
86
+
87
+ /* Badge count */
88
+ .ui-sidebar-item__badge {
89
+ flex-shrink: 0;
90
+ min-width: 18px;
91
+ height: 18px;
92
+ padding: 0 var(--spacing-2xs);
93
+ border-radius: var(--radius-infinite);
94
+ background-color: var(--sidebar-primary);
95
+ color: var(--sidebar-primary-foreground);
96
+ font-size: 11px;
97
+ font-weight: 500;
98
+ line-height: 18px;
99
+ text-align: center;
100
+ }
101
+
102
+ /* Expand / collapse chevron */
103
+ .ui-sidebar-item__chevron {
104
+ flex-shrink: 0;
105
+ display: flex;
106
+ align-items: center;
107
+ color: var(--sidebar-muted);
108
+ transition: transform 0.2s ease;
109
+ }
110
+
111
+ .ui-sidebar-item--expanded .ui-sidebar-item__chevron {
112
+ transform: rotate(180deg);
113
+ }
114
+
115
+ /* Collapsed (icon-only) mode */
116
+ .ui-sidebar-item--collapsed {
117
+ width: 32px;
118
+ height: 32px;
119
+ padding: 0;
120
+ justify-content: center;
121
+ }
122
+
123
+ .ui-sidebar-item--collapsed .ui-sidebar-item__label,
124
+ .ui-sidebar-item--collapsed .ui-sidebar-item__badge,
125
+ .ui-sidebar-item--collapsed .ui-sidebar-item__chevron {
126
+ display: none;
127
+ }
128
+
129
+ .ui-sidebar-item--collapsed .ui-sidebar-item__icon {
130
+ width: 18px;
131
+ height: 18px;
132
+ color: var(--sidebar-foreground);
133
+ }
134
+
135
+ .ui-sidebar-item--collapsed.ui-sidebar-item--active .ui-sidebar-item__icon {
136
+ color: var(--sidebar-primary);
137
+ }
138
+
139
+ .ui-sidebar-item--collapsed.ui-sidebar-item--large {
140
+ width: 40px;
141
+ height: 40px;
142
+ }