@skewedaspect/sleekspace-ui 0.2.0-beta.1

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 (266) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/sleekspace-ui.css +12844 -0
  4. package/dist/sleekspace-ui.es.js +19021 -0
  5. package/dist/sleekspace-ui.umd.js +19040 -0
  6. package/docs/components/accordion.md +92 -0
  7. package/docs/components/alert.md +72 -0
  8. package/docs/components/avatar.md +69 -0
  9. package/docs/components/breadcrumbs.md +65 -0
  10. package/docs/components/button/_meta.yaml +12 -0
  11. package/docs/components/button/accessibility.md +16 -0
  12. package/docs/components/button/custom-colors.md +18 -0
  13. package/docs/components/button/icons.md +31 -0
  14. package/docs/components/button/intro.md +8 -0
  15. package/docs/components/button/kinds.md +25 -0
  16. package/docs/components/button/sizes.md +14 -0
  17. package/docs/components/button/states.md +12 -0
  18. package/docs/components/button/usage.md +23 -0
  19. package/docs/components/button/variants.md +14 -0
  20. package/docs/components/button.md +110 -0
  21. package/docs/components/card.md +87 -0
  22. package/docs/components/checkbox.md +77 -0
  23. package/docs/components/collapsible.md +71 -0
  24. package/docs/components/divider.md +62 -0
  25. package/docs/components/dropdown.md +88 -0
  26. package/docs/components/field.md +80 -0
  27. package/docs/components/group.md +41 -0
  28. package/docs/components/input.md +84 -0
  29. package/docs/components/listbox.md +82 -0
  30. package/docs/components/modal.md +101 -0
  31. package/docs/components/navbar.md +64 -0
  32. package/docs/components/number-input.md +78 -0
  33. package/docs/components/page.md +77 -0
  34. package/docs/components/pagination.md +88 -0
  35. package/docs/components/panel.md +74 -0
  36. package/docs/components/popover.md +93 -0
  37. package/docs/components/progress.md +76 -0
  38. package/docs/components/radio.md +86 -0
  39. package/docs/components/sidebar.md +74 -0
  40. package/docs/components/skeleton.md +76 -0
  41. package/docs/components/slider.md +94 -0
  42. package/docs/components/spinner.md +59 -0
  43. package/docs/components/switch.md +97 -0
  44. package/docs/components/table.md +91 -0
  45. package/docs/components/tabs.md +108 -0
  46. package/docs/components/tag.md +75 -0
  47. package/docs/components/tags-input.md +88 -0
  48. package/docs/components/textarea.md +80 -0
  49. package/docs/components/theme.md +65 -0
  50. package/docs/components/toast.md +95 -0
  51. package/docs/components/tooltip.md +90 -0
  52. package/docs/guides/custom-colors.md +84 -0
  53. package/docs/guides/design-tokens.md +105 -0
  54. package/docs/guides/getting-started.md +144 -0
  55. package/docs/guides/installation.md +62 -0
  56. package/docs/guides/theming.md +101 -0
  57. package/package.json +76 -0
  58. package/src/components/Accordion/SkAccordion.vue +133 -0
  59. package/src/components/Accordion/SkAccordionItem.vue +131 -0
  60. package/src/components/Accordion/index.ts +3 -0
  61. package/src/components/Accordion/types.ts +9 -0
  62. package/src/components/Alert/SkAlert.vue +137 -0
  63. package/src/components/Alert/types.ts +10 -0
  64. package/src/components/Avatar/SkAvatar.vue +141 -0
  65. package/src/components/Avatar/index.ts +8 -0
  66. package/src/components/Avatar/types.ts +31 -0
  67. package/src/components/Breadcrumbs/SkBreadcrumbItem.vue +76 -0
  68. package/src/components/Breadcrumbs/SkBreadcrumbSeparator.vue +38 -0
  69. package/src/components/Breadcrumbs/SkBreadcrumbs.vue +93 -0
  70. package/src/components/Breadcrumbs/index.ts +10 -0
  71. package/src/components/Breadcrumbs/types.ts +36 -0
  72. package/src/components/Button/SkButton.vue +148 -0
  73. package/src/components/Button/types.ts +21 -0
  74. package/src/components/Card/SkCard.vue +144 -0
  75. package/src/components/Card/types.ts +12 -0
  76. package/src/components/Checkbox/SkCheckbox.vue +136 -0
  77. package/src/components/Checkbox/index.ts +8 -0
  78. package/src/components/Checkbox/types.ts +10 -0
  79. package/src/components/Collapsible/SkCollapsible.vue +159 -0
  80. package/src/components/Collapsible/index.ts +2 -0
  81. package/src/components/Collapsible/types.ts +8 -0
  82. package/src/components/Divider/SkDivider.vue +63 -0
  83. package/src/components/Divider/types.ts +15 -0
  84. package/src/components/Dropdown/SkDropdown.vue +150 -0
  85. package/src/components/Dropdown/SkDropdownMenuItem.vue +58 -0
  86. package/src/components/Dropdown/SkDropdownMenuSeparator.vue +26 -0
  87. package/src/components/Dropdown/SkDropdownSubmenu.vue +107 -0
  88. package/src/components/Dropdown/index.ts +11 -0
  89. package/src/components/Dropdown/types.ts +11 -0
  90. package/src/components/Field/SkField.vue +152 -0
  91. package/src/components/Field/index.ts +8 -0
  92. package/src/components/Field/types.ts +7 -0
  93. package/src/components/Group/SkGroup.vue +52 -0
  94. package/src/components/Group/types.ts +10 -0
  95. package/src/components/Input/SkInput.vue +117 -0
  96. package/src/components/Input/index.ts +8 -0
  97. package/src/components/Input/types.ts +11 -0
  98. package/src/components/Listbox/SkListbox.vue +164 -0
  99. package/src/components/Listbox/SkListboxItem.vue +68 -0
  100. package/src/components/Listbox/SkListboxSeparator.vue +26 -0
  101. package/src/components/Listbox/index.ts +10 -0
  102. package/src/components/Listbox/types.ts +10 -0
  103. package/src/components/Modal/SkModal.vue +231 -0
  104. package/src/components/Modal/index.ts +8 -0
  105. package/src/components/Modal/types.ts +12 -0
  106. package/src/components/NavBar/SkNavBar.vue +83 -0
  107. package/src/components/NavBar/index.ts +8 -0
  108. package/src/components/NavBar/types.ts +15 -0
  109. package/src/components/NumberInput/SkNumberInput.vue +168 -0
  110. package/src/components/NumberInput/index.ts +8 -0
  111. package/src/components/NumberInput/types.ts +10 -0
  112. package/src/components/Page/SkPage.vue +94 -0
  113. package/src/components/Page/index.ts +8 -0
  114. package/src/components/Page/types.ts +21 -0
  115. package/src/components/Pagination/SkPagination.vue +185 -0
  116. package/src/components/Pagination/SkPaginationItem.vue +107 -0
  117. package/src/components/Pagination/index.ts +9 -0
  118. package/src/components/Pagination/types.ts +40 -0
  119. package/src/components/Panel/SkPanel.vue +96 -0
  120. package/src/components/Panel/types.ts +15 -0
  121. package/src/components/Popover/SkPopover.vue +185 -0
  122. package/src/components/Popover/index.ts +8 -0
  123. package/src/components/Popover/types.ts +11 -0
  124. package/src/components/Progress/SkProgress.vue +144 -0
  125. package/src/components/Progress/index.ts +8 -0
  126. package/src/components/Progress/types.ts +34 -0
  127. package/src/components/Radio/SkRadio.vue +110 -0
  128. package/src/components/Radio/SkRadioGroup.vue +92 -0
  129. package/src/components/Radio/index.ts +9 -0
  130. package/src/components/Radio/types.ts +11 -0
  131. package/src/components/Sidebar/README.md +405 -0
  132. package/src/components/Sidebar/SkSidebar.vue +88 -0
  133. package/src/components/Sidebar/SkSidebarItem.vue +58 -0
  134. package/src/components/Sidebar/SkSidebarSection.vue +40 -0
  135. package/src/components/Sidebar/types.ts +3 -0
  136. package/src/components/Skeleton/SkSkeleton.vue +171 -0
  137. package/src/components/Skeleton/index.ts +8 -0
  138. package/src/components/Skeleton/types.ts +31 -0
  139. package/src/components/Slider/SkSlider.vue +165 -0
  140. package/src/components/Slider/index.ts +8 -0
  141. package/src/components/Slider/types.ts +44 -0
  142. package/src/components/Spinner/SkSpinner.vue +105 -0
  143. package/src/components/Spinner/index.ts +8 -0
  144. package/src/components/Spinner/types.ts +28 -0
  145. package/src/components/Switch/SkSwitch.vue +215 -0
  146. package/src/components/Switch/index.ts +8 -0
  147. package/src/components/Switch/types.ts +12 -0
  148. package/src/components/Table/SkTable.vue +109 -0
  149. package/src/components/Table/index.ts +2 -0
  150. package/src/components/Table/types.ts +15 -0
  151. package/src/components/Tabs/README.md +331 -0
  152. package/src/components/Tabs/SkTab.vue +84 -0
  153. package/src/components/Tabs/SkTabList.vue +62 -0
  154. package/src/components/Tabs/SkTabPanel.vue +47 -0
  155. package/src/components/Tabs/SkTabPanels.vue +23 -0
  156. package/src/components/Tabs/SkTabs.vue +124 -0
  157. package/src/components/Tabs/types.ts +21 -0
  158. package/src/components/Tag/SkTag.vue +129 -0
  159. package/src/components/Tag/types.ts +15 -0
  160. package/src/components/TagsInput/SkTagsInput.vue +184 -0
  161. package/src/components/TagsInput/index.ts +8 -0
  162. package/src/components/TagsInput/types.ts +10 -0
  163. package/src/components/Textarea/SkTextarea.vue +117 -0
  164. package/src/components/Textarea/index.ts +8 -0
  165. package/src/components/Textarea/types.ts +10 -0
  166. package/src/components/Theme/SkTheme.vue +47 -0
  167. package/src/components/Theme/types.ts +17 -0
  168. package/src/components/Theme/useTheme.ts +131 -0
  169. package/src/components/Toast/SkToast.vue +156 -0
  170. package/src/components/Toast/SkToastProvider.vue +180 -0
  171. package/src/components/Toast/index.ts +15 -0
  172. package/src/components/Toast/types.ts +63 -0
  173. package/src/components/Toast/useToast.ts +78 -0
  174. package/src/components/Tooltip/SkTooltip.vue +162 -0
  175. package/src/components/Tooltip/SkTooltipProvider.vue +114 -0
  176. package/src/components/Tooltip/index.ts +9 -0
  177. package/src/components/Tooltip/types.ts +13 -0
  178. package/src/composables/useCustomColors.test.ts +505 -0
  179. package/src/composables/useCustomColors.ts +124 -0
  180. package/src/composables/usePortalContext.test.ts +402 -0
  181. package/src/composables/usePortalContext.ts +95 -0
  182. package/src/global.d.ts +76 -0
  183. package/src/index.ts +259 -0
  184. package/src/styles/_scrollbar.scss +100 -0
  185. package/src/styles/base/_fonts.scss +105 -0
  186. package/src/styles/base/_global.scss +47 -0
  187. package/src/styles/base/_index.scss +24 -0
  188. package/src/styles/base/_reset.scss +11 -0
  189. package/src/styles/base/_typography.scss +178 -0
  190. package/src/styles/components/_accordion.scss +250 -0
  191. package/src/styles/components/_alert.scss +239 -0
  192. package/src/styles/components/_avatar.scss +133 -0
  193. package/src/styles/components/_breadcrumbs.scss +137 -0
  194. package/src/styles/components/_button.scss +731 -0
  195. package/src/styles/components/_card.scss +141 -0
  196. package/src/styles/components/_checkbox.scss +232 -0
  197. package/src/styles/components/_collapsible.scss +158 -0
  198. package/src/styles/components/_divider.scss +121 -0
  199. package/src/styles/components/_field.scss +87 -0
  200. package/src/styles/components/_group.scss +138 -0
  201. package/src/styles/components/_index.scss +46 -0
  202. package/src/styles/components/_input.scss +205 -0
  203. package/src/styles/components/_listbox.scss +453 -0
  204. package/src/styles/components/_menu.scss +216 -0
  205. package/src/styles/components/_modal.scss +329 -0
  206. package/src/styles/components/_navbar.scss +258 -0
  207. package/src/styles/components/_number-input.scss +352 -0
  208. package/src/styles/components/_page.scss +98 -0
  209. package/src/styles/components/_pagination.scss +411 -0
  210. package/src/styles/components/_panel.scss +281 -0
  211. package/src/styles/components/_popover.scss +258 -0
  212. package/src/styles/components/_progress.scss +280 -0
  213. package/src/styles/components/_radio.scss +255 -0
  214. package/src/styles/components/_sidebar.scss +92 -0
  215. package/src/styles/components/_skeleton.scss +138 -0
  216. package/src/styles/components/_slider.scss +262 -0
  217. package/src/styles/components/_spinner.scss +331 -0
  218. package/src/styles/components/_switch.scss +370 -0
  219. package/src/styles/components/_table.scss +405 -0
  220. package/src/styles/components/_tabs.scss +486 -0
  221. package/src/styles/components/_tag.scss +425 -0
  222. package/src/styles/components/_tags-input.scss +279 -0
  223. package/src/styles/components/_textarea.scss +208 -0
  224. package/src/styles/components/_toast.scss +331 -0
  225. package/src/styles/components/_tooltip.scss +206 -0
  226. package/src/styles/fonts/Titillium_Web/OFL.txt +93 -0
  227. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Black.ttf +0 -0
  228. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Bold.ttf +0 -0
  229. package/src/styles/fonts/Titillium_Web/TitilliumWeb-BoldItalic.ttf +0 -0
  230. package/src/styles/fonts/Titillium_Web/TitilliumWeb-ExtraLight.ttf +0 -0
  231. package/src/styles/fonts/Titillium_Web/TitilliumWeb-ExtraLightItalic.ttf +0 -0
  232. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Italic.ttf +0 -0
  233. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Light.ttf +0 -0
  234. package/src/styles/fonts/Titillium_Web/TitilliumWeb-LightItalic.ttf +0 -0
  235. package/src/styles/fonts/Titillium_Web/TitilliumWeb-Regular.ttf +0 -0
  236. package/src/styles/fonts/Titillium_Web/TitilliumWeb-SemiBold.ttf +0 -0
  237. package/src/styles/fonts/Titillium_Web/TitilliumWeb-SemiBoldItalic.ttf +0 -0
  238. package/src/styles/index.scss +17 -0
  239. package/src/styles/mixins/_cut-border.scss +254 -0
  240. package/src/styles/mixins/_index.scss +7 -0
  241. package/src/styles/theme/_variables.scss +42 -0
  242. package/src/styles/themes/README.md +127 -0
  243. package/src/styles/themes/_colorful.scss +58 -0
  244. package/src/styles/themes/_greyscale.scss +58 -0
  245. package/src/styles/themes/index.scss +9 -0
  246. package/src/styles/tokens/README.md +268 -0
  247. package/src/styles/tokens/_foundation-borders.scss +26 -0
  248. package/src/styles/tokens/_foundation-colors.scss +169 -0
  249. package/src/styles/tokens/_foundation-glow.scss +36 -0
  250. package/src/styles/tokens/_foundation-radius.scss +53 -0
  251. package/src/styles/tokens/_foundation-scrollbar.scss +31 -0
  252. package/src/styles/tokens/_foundation-shadows.scss +37 -0
  253. package/src/styles/tokens/_foundation-space.scss +36 -0
  254. package/src/styles/tokens/_foundation-transitions.scss +37 -0
  255. package/src/styles/tokens/_foundation-typography.scss +58 -0
  256. package/src/styles/tokens/_semantic-color-kinds.scss +112 -0
  257. package/src/styles/tokens/_semantic-colors.scss +10 -0
  258. package/src/styles/tokens/_semantic-interactive.scss +29 -0
  259. package/src/styles/tokens/_semantic-scrollbar.scss +48 -0
  260. package/src/styles/tokens/_semantic-surfaces.scss +36 -0
  261. package/src/styles/tokens/index.scss +38 -0
  262. package/src/styles/tokens.scss +268 -0
  263. package/src/styles/utilities/_index.scss +9 -0
  264. package/src/styles/utilities/_typography.scss +121 -0
  265. package/src/types.ts +50 -0
  266. package/web-types.json +3524 -0
@@ -0,0 +1,486 @@
1
+ //----------------------------------------------------------------------------------------------------------------------
2
+ // Tabs Component Styles
3
+ //----------------------------------------------------------------------------------------------------------------------
4
+
5
+ @use '../theme/variables' as *;
6
+
7
+ //----------------------------------------------------------------------------------------------------------------------
8
+ // Tabs Design Tokens
9
+ //----------------------------------------------------------------------------------------------------------------------
10
+
11
+ .sk-tabs
12
+ {
13
+ //------------------------------------------------------------------------------------------------------------------
14
+ // Spacing Tokens
15
+ //------------------------------------------------------------------------------------------------------------------
16
+
17
+ /// Gap between tabs in the tab list
18
+ --sk-tab-list-gap: 0.5rem;
19
+
20
+ /// Gap between tab content items (icon + text spacing)
21
+ --sk-tab-content-gap: 0.5rem;
22
+
23
+ /// Horizontal padding for tabs
24
+ --sk-tab-padding-x: 0.5rem;
25
+
26
+ /// Vertical padding for tabs
27
+ --sk-tab-padding-y: 0.65rem;
28
+
29
+ /// Padding for tab panels
30
+ --sk-tab-panel-padding: 0.5rem;
31
+
32
+ /// Minimum width for vertical tab lists
33
+ --sk-tab-list-vertical-min-width: 50px;
34
+
35
+ //------------------------------------------------------------------------------------------------------------------
36
+ // Typography Tokens
37
+ //------------------------------------------------------------------------------------------------------------------
38
+
39
+ /// Font size for tab text
40
+ --sk-tab-font-size: 0.875rem;
41
+
42
+ /// Font weight for tab text
43
+ --sk-tab-font-weight: 500;
44
+
45
+ /// Font weight for active tabs (increased emphasis)
46
+ --sk-tab-font-weight-active: 600;
47
+
48
+ /// Line height for tab text
49
+ --sk-tab-line-height: 1.5;
50
+
51
+ //------------------------------------------------------------------------------------------------------------------
52
+ // Border Tokens
53
+ //------------------------------------------------------------------------------------------------------------------
54
+
55
+ /// Width of the underline indicator
56
+ --sk-tab-underline-width: 2px;
57
+
58
+ /// Width of the tab list border (horizontal bottom or vertical right)
59
+ --sk-tab-list-border-width: var(--sk-border-width-thin);
60
+
61
+ /// Opacity of tab list border
62
+ --sk-tab-list-border-opacity: 0.2;
63
+
64
+ /// Border radius for focus ring
65
+ --sk-tab-focus-radius: 4px;
66
+
67
+ /// Focus ring width
68
+ --sk-tab-focus-width: 2px;
69
+
70
+ /// Focus ring offset
71
+ --sk-tab-focus-offset: 2px;
72
+
73
+ /// Cut corner size for horizontal tabs (active tab background)
74
+ --sk-tab-cut-corner-horizontal: 7px;
75
+
76
+ /// Cut corner size for vertical tabs (active tab background)
77
+ --sk-tab-cut-corner-vertical: 5px;
78
+
79
+ //------------------------------------------------------------------------------------------------------------------
80
+ // Transition Tokens
81
+ //------------------------------------------------------------------------------------------------------------------
82
+
83
+ /// Tab transition duration (references global foundation token)
84
+ --sk-tab-transition-duration: var(--sk-transition-normal);
85
+
86
+ /// Tab transition easing (references global foundation token)
87
+ --sk-tab-transition-easing: var(--sk-transition-easing);
88
+
89
+ //------------------------------------------------------------------------------------------------------------------
90
+ // State Tokens
91
+ //------------------------------------------------------------------------------------------------------------------
92
+
93
+ /// Disabled state opacity (references global foundation token)
94
+ --sk-tab-disabled-opacity: var(--sk-opacity-disabled);
95
+
96
+ /// Inactive tab opacity (dimmed text for non-active tabs)
97
+ --sk-tab-inactive-opacity: 0.7;
98
+
99
+ //------------------------------------------------------------------------------------------------------------------
100
+ // Color Tokens
101
+ //------------------------------------------------------------------------------------------------------------------
102
+ // These base tokens are overridden by each kind (neutral, primary, accent, etc.).
103
+ // This ensures consistent color behavior across all tab kinds.
104
+
105
+ /// Base color - the semantic color used for active tabs and underlines
106
+ /// Can be overridden externally via inline styles or CSS
107
+ --sk-tab-color-base: var(--sk-neutral-base);
108
+
109
+ /// Foreground/text color - calculated for optimal contrast
110
+ /// Can be overridden externally via inline styles or CSS
111
+ --sk-tab-fg: var(--sk-neutral-text);
112
+
113
+ /// Background color for active tabs (underline variant) - darkened version of base color
114
+ /// Same formula as buttons for consistency
115
+ --sk-tab-bg: color-mix(
116
+ in oklch,
117
+ color-mix(in oklch, var(--sk-tab-color-base) 75%, transparent 25%),
118
+ #000 46.25%
119
+ );
120
+
121
+ /// Active tab background opacity (subtle variant style)
122
+ --sk-tab-active-bg-opacity: var(--sk-opacity-subtle);
123
+ }
124
+
125
+ //----------------------------------------------------------------------------------------------------------------------
126
+ // Tabs Container
127
+ //----------------------------------------------------------------------------------------------------------------------
128
+
129
+ .sk-tabs
130
+ {
131
+ display: flex;
132
+
133
+ // Horizontal orientation
134
+ &.sk-horizontal
135
+ {
136
+ flex-direction: column;
137
+
138
+ &.sk-placement-start
139
+ {
140
+ // Tab list at top (default for horizontal)
141
+ }
142
+
143
+ &.sk-placement-end
144
+ {
145
+ flex-direction: column-reverse; // Tab list at bottom
146
+ }
147
+ }
148
+
149
+ // Vertical orientation
150
+ &.sk-vertical
151
+ {
152
+ --sk-tab-padding-x: 1.0rem;
153
+ --sk-tab-padding-y: 0.25rem;
154
+
155
+ flex-direction: row;
156
+
157
+ &.sk-placement-start
158
+ {
159
+ // Tab list on left (default for vertical)
160
+ }
161
+
162
+ &.sk-placement-end
163
+ {
164
+ flex-direction: row-reverse; // Tab list on right
165
+ }
166
+ }
167
+
168
+ // Flush mode - use negative margins to align with container edges (e.g., inside panels)
169
+ // Apply negative margins on all sides except where the tab list border would be clipped
170
+ &.sk-flush
171
+ {
172
+ // Horizontal tabs - negative on left, right, and top/bottom depending on placement
173
+ &.sk-horizontal
174
+ {
175
+ margin-left: calc(-1 * var(--sk-panel-padding, 1rem));
176
+ margin-right: calc(-1 * var(--sk-panel-padding, 1rem));
177
+
178
+ &.sk-placement-start
179
+ {
180
+ margin-top: calc(-1 * var(--sk-panel-padding, 1rem));
181
+ margin-bottom: 0;
182
+ }
183
+
184
+ &.sk-placement-end
185
+ {
186
+ margin-top: 0;
187
+ margin-bottom: calc(-1 * var(--sk-panel-padding, 1rem));
188
+ }
189
+ }
190
+
191
+ // Vertical tabs - negative on top, bottom, and left/right depending on placement
192
+ &.sk-vertical
193
+ {
194
+ margin-top: calc(-1 * var(--sk-panel-padding, 1rem));
195
+ margin-bottom: calc(-1 * var(--sk-panel-padding, 1rem));
196
+
197
+ &.sk-placement-start
198
+ {
199
+ margin-left: calc(-1 * var(--sk-panel-padding, 1rem));
200
+ margin-right: 0;
201
+ }
202
+
203
+ &.sk-placement-end
204
+ {
205
+ margin-left: 0;
206
+ margin-right: calc(-1 * var(--sk-panel-padding, 1rem));
207
+ }
208
+ }
209
+ }
210
+ }
211
+
212
+ //----------------------------------------------------------------------------------------------------------------------
213
+ // Tab List
214
+ //----------------------------------------------------------------------------------------------------------------------
215
+
216
+ .sk-tab-list
217
+ {
218
+ display: flex;
219
+ gap: var(--sk-tab-list-gap);
220
+ position: relative;
221
+
222
+ // Horizontal layout
223
+ &.sk-horizontal
224
+ {
225
+ flex-direction: row;
226
+ border-bottom: var(--sk-tab-list-border-width) solid oklch(from var(--sk-tab-color-base) l c h / var(--sk-tab-list-border-opacity));
227
+ }
228
+
229
+ // Vertical layout
230
+ &.sk-vertical
231
+ {
232
+ flex-direction: column;
233
+ border-right: var(--sk-tab-list-border-width) solid oklch(from var(--sk-tab-color-base) l c h / var(--sk-tab-list-border-opacity));
234
+ min-width: var(--sk-tab-list-vertical-min-width);
235
+ }
236
+ }
237
+
238
+ // Flush mode padding - add internal padding to tab list (half of panel padding)
239
+ .sk-tabs.sk-flush .sk-tab-list
240
+ {
241
+ &.sk-horizontal
242
+ {
243
+ padding-left: calc(var(--sk-panel-padding, 1rem) / 2);
244
+ padding-right: calc(var(--sk-panel-padding, 1rem) / 2);
245
+ }
246
+
247
+ &.sk-vertical
248
+ {
249
+ padding-top: calc(var(--sk-panel-padding, 1rem) / 2);
250
+ padding-bottom: calc(var(--sk-panel-padding, 1rem) / 2);
251
+ }
252
+ }
253
+
254
+ //----------------------------------------------------------------------------------------------------------------------
255
+ // Individual Tab
256
+ //----------------------------------------------------------------------------------------------------------------------
257
+
258
+ .sk-tab
259
+ {
260
+ display: inline-flex;
261
+ align-items: center;
262
+ gap: var(--sk-tab-content-gap);
263
+ padding: var(--sk-tab-padding-y) var(--sk-tab-padding-x);
264
+ font-size: var(--sk-tab-font-size);
265
+ font-weight: var(--sk-tab-font-weight);
266
+ line-height: var(--sk-tab-line-height);
267
+ background: transparent;
268
+ border: none;
269
+ border-radius: 0; // Override any RekaUI defaults
270
+ cursor: pointer;
271
+ transition:
272
+ color var(--sk-tab-transition-duration) var(--sk-tab-transition-easing),
273
+ background-color var(--sk-tab-transition-duration) var(--sk-tab-transition-easing),
274
+ border-color var(--sk-tab-transition-duration) var(--sk-tab-transition-easing);
275
+ white-space: nowrap;
276
+ user-select: none;
277
+ position: relative;
278
+
279
+ // Default inactive state - dimmed foreground color for contrast
280
+ color: oklch(from var(--sk-tab-fg) l c h / var(--sk-tab-inactive-opacity));
281
+
282
+ &:hover:not(:disabled)
283
+ {
284
+ // Hover shows full foreground color
285
+ color: var(--sk-tab-fg);
286
+ }
287
+
288
+ &[data-state="active"]
289
+ {
290
+ // Active shows full foreground color
291
+ color: var(--sk-tab-fg);
292
+ }
293
+
294
+ &.sk-disabled,
295
+ &:disabled
296
+ {
297
+ opacity: var(--sk-tab-disabled-opacity);
298
+ cursor: not-allowed;
299
+ }
300
+
301
+ &:focus-visible
302
+ {
303
+ outline: var(--sk-tab-focus-width) solid var(--sk-focus-ring-color);
304
+ outline-offset: var(--sk-tab-focus-offset);
305
+ // Note: No border-radius here - it conflicts with our clip-path cut corners
306
+ }
307
+ }
308
+
309
+ //----------------------------------------------------------------------------------------------------------------------
310
+ // Tab Label (Overlapping Text for No Layout Shift)
311
+ //----------------------------------------------------------------------------------------------------------------------
312
+
313
+ .sk-tab-label
314
+ {
315
+ display: grid;
316
+ align-items: center;
317
+ line-height: 1;
318
+ white-space: nowrap;
319
+
320
+ // Overlap both spans in the same grid cell
321
+ .sk-tab-label-normal,
322
+ .sk-tab-label-bold
323
+ {
324
+ grid-area: 1 / 1;
325
+ }
326
+
327
+ .sk-tab-label-normal
328
+ {
329
+ font-weight: var(--sk-tab-font-weight);
330
+ }
331
+
332
+ .sk-tab-label-bold
333
+ {
334
+ font-weight: var(--sk-tab-font-weight-active);
335
+ visibility: hidden;
336
+ }
337
+ }
338
+
339
+ // Active state: swap visibility
340
+ .sk-tab[data-state="active"]
341
+ {
342
+ .sk-tab-label-normal
343
+ {
344
+ visibility: hidden;
345
+ }
346
+
347
+ .sk-tab-label-bold
348
+ {
349
+ visibility: visible;
350
+ }
351
+ }
352
+
353
+ //----------------------------------------------------------------------------------------------------------------------
354
+ // Tab List Styles
355
+ //----------------------------------------------------------------------------------------------------------------------
356
+
357
+ // Apply kind-based colors at tabs container level (same element as inline styles)
358
+ // This applies ONLY when a kind class is present. Without a kind class, uses the defaults
359
+ // defined in the design tokens section (neutral), allowing inline styles to override them.
360
+ .sk-tabs
361
+ {
362
+ @each $kind in $kinds
363
+ {
364
+ &.sk-#{"" + $kind}
365
+ {
366
+ --sk-tab-color-base: var(--sk-#{$kind}-base);
367
+ --sk-tab-fg: var(--sk-#{$kind}-text);
368
+ }
369
+ }
370
+ }
371
+
372
+ // Individual tabs can override with their own kind (for mixed-color tabs)
373
+ // This applies ONLY when a kind class is present on the individual tab.
374
+ .sk-tab-list .sk-tab
375
+ {
376
+ position: relative;
377
+ border-bottom: var(--sk-tab-underline-width) solid transparent;
378
+
379
+ // Apply kind-based color tokens to individual tabs
380
+ @each $kind in $kinds
381
+ {
382
+ &.sk-#{"" + $kind}
383
+ {
384
+ --sk-tab-color-base: var(--sk-#{$kind}-base);
385
+ --sk-tab-fg: var(--sk-#{$kind}-text);
386
+ }
387
+ }
388
+
389
+ // Active state styling
390
+ &[data-state="active"]
391
+ {
392
+ background-color: oklch(from var(--sk-tab-color-base) l c h / 0.15);
393
+ border-bottom-color: var(--sk-tab-color-base);
394
+ }
395
+ }
396
+
397
+ // Vertical tabs (becomes side line)
398
+ .sk-tab-list.sk-vertical .sk-tab
399
+ {
400
+ border-bottom: none;
401
+ border-right: var(--sk-tab-underline-width) solid transparent;
402
+
403
+ // For vertical, use right border instead
404
+ &[data-state="active"]
405
+ {
406
+ background-color: oklch(from var(--sk-tab-color-base) l c h / 0.15);
407
+ border-bottom-color: transparent;
408
+ border-right-color: var(--sk-tab-color-base);
409
+ }
410
+ }
411
+
412
+ // Horizontal tabs cut corners (not in flush mode)
413
+ .sk-tabs:not(.sk-flush).sk-horizontal .sk-tab-list .sk-tab[data-state="active"]
414
+ {
415
+ // Only cut upper left corner
416
+ clip-path: polygon(
417
+ var(--sk-tab-cut-corner-horizontal) 0%,
418
+ 100% 0%,
419
+ 100% 100%,
420
+ 0% 100%,
421
+ 0% var(--sk-tab-cut-corner-horizontal)
422
+ );
423
+ }
424
+
425
+ // Vertical tabs placement-specific cut corners
426
+ .sk-tabs:not(.sk-flush).sk-vertical.sk-placement-start .sk-tab-list .sk-tab[data-state="active"]
427
+ {
428
+ // Tabs on left - only cut top-left corner
429
+ clip-path: polygon(
430
+ var(--sk-tab-cut-corner-vertical) 0%,
431
+ 100% 0%,
432
+ 100% 100%,
433
+ 0% 100%,
434
+ 0% var(--sk-tab-cut-corner-vertical)
435
+ );
436
+ border-right-color: var(--sk-tab-color-base);
437
+ }
438
+
439
+ .sk-tabs:not(.sk-flush).sk-vertical.sk-placement-end .sk-tab-list .sk-tab[data-state="active"]
440
+ {
441
+ // Tabs on right - only cut top-left corner
442
+ clip-path: polygon(
443
+ var(--sk-tab-cut-corner-vertical) 0%,
444
+ 100% 0%,
445
+ 100% 100%,
446
+ 0% 100%,
447
+ 0% var(--sk-tab-cut-corner-vertical)
448
+ );
449
+ border-right-color: var(--sk-tab-color-base);
450
+ }
451
+
452
+ //----------------------------------------------------------------------------------------------------------------------
453
+ // Tab Icon
454
+ //----------------------------------------------------------------------------------------------------------------------
455
+
456
+ .sk-tab-icon
457
+ {
458
+ display: inline-flex;
459
+ align-items: center;
460
+ justify-content: center;
461
+ width: 1.25rem;
462
+ height: 1.25rem;
463
+
464
+ svg
465
+ {
466
+ width: 100%;
467
+ height: 100%;
468
+ }
469
+ }
470
+
471
+ //----------------------------------------------------------------------------------------------------------------------
472
+ // Tab Panels
473
+ //----------------------------------------------------------------------------------------------------------------------
474
+
475
+ .sk-tab-panels
476
+ {
477
+ flex: 1;
478
+ }
479
+
480
+ .sk-tab-panel
481
+ {
482
+ padding: var(--sk-tab-panel-padding);
483
+ outline: none;
484
+ }
485
+
486
+ //----------------------------------------------------------------------------------------------------------------------