@techsio/ui-kit 0.0.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 (183) hide show
  1. package/README.md +165 -0
  2. package/dist/atoms/badge.js +66 -0
  3. package/dist/atoms/button.js +275 -0
  4. package/dist/atoms/error-text.js +38 -0
  5. package/dist/atoms/extra-text.js +27 -0
  6. package/dist/atoms/icon.js +42 -0
  7. package/dist/atoms/image.js +11 -0
  8. package/dist/atoms/input.js +83 -0
  9. package/dist/atoms/label.js +43 -0
  10. package/dist/atoms/link-button.js +51 -0
  11. package/dist/atoms/link.js +23 -0
  12. package/dist/atoms/numeric-input.js +221 -0
  13. package/dist/atoms/rating.js +117 -0
  14. package/dist/atoms/textarea.js +81 -0
  15. package/dist/atoms/tooltip.js +119 -0
  16. package/dist/molecules/accordion.js +245 -0
  17. package/dist/molecules/breadcrumb.js +168 -0
  18. package/dist/molecules/carousel.js +333 -0
  19. package/dist/molecules/checkbox.js +92 -0
  20. package/dist/molecules/color-select.js +159 -0
  21. package/dist/molecules/combobox.js +253 -0
  22. package/dist/molecules/dialog.js +313 -0
  23. package/dist/molecules/form-checkbox.js +59 -0
  24. package/dist/molecules/form-input.js +55 -0
  25. package/dist/molecules/form-numeric-input.js +47 -0
  26. package/dist/molecules/form-textarea.js +54 -0
  27. package/dist/molecules/menu.js +302 -0
  28. package/dist/molecules/pagination.js +184 -0
  29. package/dist/molecules/popover.js +152 -0
  30. package/dist/molecules/product-card.js +194 -0
  31. package/dist/molecules/search-form.js +106 -0
  32. package/dist/molecules/select.js +217 -0
  33. package/dist/molecules/slider.js +249 -0
  34. package/dist/molecules/steps.js +178 -0
  35. package/dist/molecules/switch.js +109 -0
  36. package/dist/molecules/tabs.js +211 -0
  37. package/dist/molecules/toast.js +126 -0
  38. package/dist/molecules/tree-view.js +451 -0
  39. package/dist/organisms/footer.js +209 -0
  40. package/dist/organisms/header.js +245 -0
  41. package/dist/organisms/table.js +233 -0
  42. package/dist/src/atoms/badge.d.ts +59 -0
  43. package/dist/src/atoms/badge.d.ts.map +1 -0
  44. package/dist/src/atoms/button.d.ts +97 -0
  45. package/dist/src/atoms/button.d.ts.map +1 -0
  46. package/dist/src/atoms/error-text.d.ts +29 -0
  47. package/dist/src/atoms/error-text.d.ts.map +1 -0
  48. package/dist/src/atoms/extra-text.d.ts +27 -0
  49. package/dist/src/atoms/extra-text.d.ts.map +1 -0
  50. package/dist/src/atoms/icon.d.ts +65 -0
  51. package/dist/src/atoms/icon.d.ts.map +1 -0
  52. package/dist/src/atoms/image.d.ts +17 -0
  53. package/dist/src/atoms/image.d.ts.map +1 -0
  54. package/dist/src/atoms/input.d.ts +78 -0
  55. package/dist/src/atoms/input.d.ts.map +1 -0
  56. package/dist/src/atoms/label.d.ts +41 -0
  57. package/dist/src/atoms/label.d.ts.map +1 -0
  58. package/dist/src/atoms/link-button.d.ts +129 -0
  59. package/dist/src/atoms/link-button.d.ts.map +1 -0
  60. package/dist/src/atoms/link.d.ts +17 -0
  61. package/dist/src/atoms/link.d.ts.map +1 -0
  62. package/dist/src/atoms/numeric-input.d.ts +64 -0
  63. package/dist/src/atoms/numeric-input.d.ts.map +1 -0
  64. package/dist/src/atoms/rating.d.ts +108 -0
  65. package/dist/src/atoms/rating.d.ts.map +1 -0
  66. package/dist/src/atoms/textarea.d.ts +81 -0
  67. package/dist/src/atoms/textarea.d.ts.map +1 -0
  68. package/dist/src/atoms/tooltip.d.ts +88 -0
  69. package/dist/src/atoms/tooltip.d.ts.map +1 -0
  70. package/dist/src/molecules/accordion.d.ts +182 -0
  71. package/dist/src/molecules/accordion.d.ts.map +1 -0
  72. package/dist/src/molecules/breadcrumb.d.ts +117 -0
  73. package/dist/src/molecules/breadcrumb.d.ts.map +1 -0
  74. package/dist/src/molecules/carousel.d.ts +261 -0
  75. package/dist/src/molecules/carousel.d.ts.map +1 -0
  76. package/dist/src/molecules/checkbox.d.ts +19 -0
  77. package/dist/src/molecules/checkbox.d.ts.map +1 -0
  78. package/dist/src/molecules/color-select.d.ts +20 -0
  79. package/dist/src/molecules/color-select.d.ts.map +1 -0
  80. package/dist/src/molecules/combobox.d.ts +141 -0
  81. package/dist/src/molecules/combobox.d.ts.map +1 -0
  82. package/dist/src/molecules/dialog.d.ts +234 -0
  83. package/dist/src/molecules/dialog.d.ts.map +1 -0
  84. package/dist/src/molecules/form-checkbox.d.ts +15 -0
  85. package/dist/src/molecules/form-checkbox.d.ts.map +1 -0
  86. package/dist/src/molecules/form-input.d.ts +14 -0
  87. package/dist/src/molecules/form-input.d.ts.map +1 -0
  88. package/dist/src/molecules/form-numeric-input.d.ts +14 -0
  89. package/dist/src/molecules/form-numeric-input.d.ts.map +1 -0
  90. package/dist/src/molecules/form-textarea.d.ts +14 -0
  91. package/dist/src/molecules/form-textarea.d.ts.map +1 -0
  92. package/dist/src/molecules/menu.d.ts +153 -0
  93. package/dist/src/molecules/menu.d.ts.map +1 -0
  94. package/dist/src/molecules/pagination.d.ts +123 -0
  95. package/dist/src/molecules/pagination.d.ts.map +1 -0
  96. package/dist/src/molecules/popover.d.ts +124 -0
  97. package/dist/src/molecules/popover.d.ts.map +1 -0
  98. package/dist/src/molecules/product-card.d.ts +160 -0
  99. package/dist/src/molecules/product-card.d.ts.map +1 -0
  100. package/dist/src/molecules/search-form.d.ts +39 -0
  101. package/dist/src/molecules/search-form.d.ts.map +1 -0
  102. package/dist/src/molecules/select.d.ts +126 -0
  103. package/dist/src/molecules/select.d.ts.map +1 -0
  104. package/dist/src/molecules/slider.d.ts +120 -0
  105. package/dist/src/molecules/slider.d.ts.map +1 -0
  106. package/dist/src/molecules/steps.d.ts +96 -0
  107. package/dist/src/molecules/steps.d.ts.map +1 -0
  108. package/dist/src/molecules/switch.d.ts +71 -0
  109. package/dist/src/molecules/switch.d.ts.map +1 -0
  110. package/dist/src/molecules/tabs.d.ts +207 -0
  111. package/dist/src/molecules/tabs.d.ts.map +1 -0
  112. package/dist/src/molecules/toast.d.ts +83 -0
  113. package/dist/src/molecules/toast.d.ts.map +1 -0
  114. package/dist/src/molecules/tree-view.d.ts +202 -0
  115. package/dist/src/molecules/tree-view.d.ts.map +1 -0
  116. package/dist/src/organisms/footer.d.ts +254 -0
  117. package/dist/src/organisms/footer.d.ts.map +1 -0
  118. package/dist/src/organisms/header.d.ts +186 -0
  119. package/dist/src/organisms/header.d.ts.map +1 -0
  120. package/dist/src/organisms/table.d.ts +250 -0
  121. package/dist/src/organisms/table.d.ts.map +1 -0
  122. package/dist/src/templates/accordion.d.ts +15 -0
  123. package/dist/src/templates/accordion.d.ts.map +1 -0
  124. package/dist/src/templates/carousel.d.ts +13 -0
  125. package/dist/src/templates/carousel.d.ts.map +1 -0
  126. package/dist/src/templates/numeric-input.d.ts +14 -0
  127. package/dist/src/templates/numeric-input.d.ts.map +1 -0
  128. package/dist/src/templates/product-card.d.ts +33 -0
  129. package/dist/src/templates/product-card.d.ts.map +1 -0
  130. package/dist/src/templates/tabs.d.ts +16 -0
  131. package/dist/src/templates/tabs.d.ts.map +1 -0
  132. package/dist/src/types/zag.d.ts +19 -0
  133. package/dist/src/types/zag.d.ts.map +1 -0
  134. package/dist/src/utils.d.ts +4 -0
  135. package/dist/src/utils.d.ts.map +1 -0
  136. package/dist/templates/accordion.js +37 -0
  137. package/dist/templates/carousel.js +55 -0
  138. package/dist/templates/numeric-input.js +49 -0
  139. package/dist/templates/product-card.js +92 -0
  140. package/dist/templates/tabs.js +34 -0
  141. package/dist/types/zag.js +0 -0
  142. package/dist/utils.js +20 -0
  143. package/package.json +126 -0
  144. package/src/tokens/_base.css +25 -0
  145. package/src/tokens/_colors.css +5 -0
  146. package/src/tokens/_layout.css +34 -0
  147. package/src/tokens/_semantic.css +360 -0
  148. package/src/tokens/_spacing.css +22 -0
  149. package/src/tokens/_typography.css +17 -0
  150. package/src/tokens/components/atoms/_badge.css +61 -0
  151. package/src/tokens/components/atoms/_button.css +215 -0
  152. package/src/tokens/components/atoms/_icon.css +122 -0
  153. package/src/tokens/components/atoms/_input.css +125 -0
  154. package/src/tokens/components/atoms/_numeric-input.css +57 -0
  155. package/src/tokens/components/atoms/_rating.css +33 -0
  156. package/src/tokens/components/atoms/_textarea.css +93 -0
  157. package/src/tokens/components/atoms/_tooltip.css +21 -0
  158. package/src/tokens/components/components.css +32 -0
  159. package/src/tokens/components/molecules/_accordion.css +85 -0
  160. package/src/tokens/components/molecules/_breadcrumb.css +44 -0
  161. package/src/tokens/components/molecules/_carousel.css +72 -0
  162. package/src/tokens/components/molecules/_checkbox.css +29 -0
  163. package/src/tokens/components/molecules/_color-select.css +61 -0
  164. package/src/tokens/components/molecules/_combobox.css +116 -0
  165. package/src/tokens/components/molecules/_dialog.css +75 -0
  166. package/src/tokens/components/molecules/_menu.css +48 -0
  167. package/src/tokens/components/molecules/_pagination.css +75 -0
  168. package/src/tokens/components/molecules/_popover.css +39 -0
  169. package/src/tokens/components/molecules/_product-card.css +85 -0
  170. package/src/tokens/components/molecules/_search-form.css +10 -0
  171. package/src/tokens/components/molecules/_select.css +88 -0
  172. package/src/tokens/components/molecules/_slider.css +75 -0
  173. package/src/tokens/components/molecules/_steps.css +54 -0
  174. package/src/tokens/components/molecules/_switch.css +62 -0
  175. package/src/tokens/components/molecules/_tabs.css +69 -0
  176. package/src/tokens/components/molecules/_toast.css +77 -0
  177. package/src/tokens/components/molecules/_tree-view.css +80 -0
  178. package/src/tokens/components/molecules/index.css +2 -0
  179. package/src/tokens/components/organisms/_footer.css +90 -0
  180. package/src/tokens/components/organisms/_header.css +86 -0
  181. package/src/tokens/components/organisms/_table.css +63 -0
  182. package/src/tokens/index.css +67 -0
  183. package/src/tokens/tokens-only.css +66 -0
@@ -0,0 +1,34 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Tabs } from "../molecules/tabs.js";
3
+ function TabsTemplate({ items, showIndicator = false, variant = 'default', size = 'md', fitted = false, justify = 'start', orientation = 'horizontal', defaultValue, value, onValueChange, ref, className, ...tabsProps }) {
4
+ return /*#__PURE__*/ jsxs(Tabs, {
5
+ ref: ref,
6
+ variant: variant,
7
+ size: size,
8
+ fitted: fitted,
9
+ justify: justify,
10
+ orientation: orientation,
11
+ defaultValue: defaultValue,
12
+ value: value,
13
+ onValueChange: onValueChange,
14
+ className: className,
15
+ ...tabsProps,
16
+ children: [
17
+ /*#__PURE__*/ jsxs(Tabs.List, {
18
+ children: [
19
+ items.map((item)=>/*#__PURE__*/ jsx(Tabs.Trigger, {
20
+ value: item.value,
21
+ disabled: item.disabled,
22
+ children: item.label
23
+ }, item.value)),
24
+ showIndicator && /*#__PURE__*/ jsx(Tabs.Indicator, {})
25
+ ]
26
+ }),
27
+ items.map((item)=>/*#__PURE__*/ jsx(Tabs.Content, {
28
+ value: item.value,
29
+ children: item.content
30
+ }, item.value))
31
+ ]
32
+ });
33
+ }
34
+ export { TabsTemplate };
File without changes
package/dist/utils.js ADDED
@@ -0,0 +1,20 @@
1
+ import { createTV } from "tailwind-variants";
2
+ const TEXT_SIZE_REGEX = /-(size|sm|md|lg|\d?x?[sml])$/;
3
+ const WHITESPACE_REGEX = /\s+/g;
4
+ const NON_WORD_REGEX = /[^\w-]+/g;
5
+ const MULTIPLE_DASHES_REGEX = /--+/g;
6
+ const LEADING_DASHES_REGEX = /^-+/;
7
+ const TRAILING_DASHES_REGEX = /-+$/;
8
+ const tv = createTV({
9
+ twMergeConfig: {
10
+ theme: {
11
+ text: [
12
+ (value)=>TEXT_SIZE_REGEX.test(value)
13
+ ]
14
+ }
15
+ }
16
+ });
17
+ function slugify(str) {
18
+ return str.toString().toLowerCase().replace(WHITESPACE_REGEX, '-').replace(NON_WORD_REGEX, '').replace(MULTIPLE_DASHES_REGEX, '-').replace(LEADING_DASHES_REGEX, '').replace(TRAILING_DASHES_REGEX, '');
19
+ }
20
+ export { slugify, tv };
package/package.json ADDED
@@ -0,0 +1,126 @@
1
+ {
2
+ "name": "@techsio/ui-kit",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "exports": {
6
+ "./types/zag": {
7
+ "types": "./dist/src/types/zag.d.ts",
8
+ "import": "./dist/types/zag.js"
9
+ },
10
+ "./tokens": {
11
+ "import": "./src/tokens/tokens-only.css"
12
+ },
13
+ "./tokens-with-tailwind": {
14
+ "import": "./src/tokens/index.css"
15
+ },
16
+ "./tokens/*": {
17
+ "import": "./src/tokens/*.css"
18
+ },
19
+ "./atoms/*": {
20
+ "types": "./dist/src/atoms/*.d.ts",
21
+ "import": "./dist/atoms/*.js"
22
+ },
23
+ "./molecules/*": {
24
+ "types": "./dist/src/molecules/*.d.ts",
25
+ "import": "./dist/molecules/*.js"
26
+ },
27
+ "./organisms/*": {
28
+ "types": "./dist/src/organisms/*.d.ts",
29
+ "import": "./dist/organisms/*.js"
30
+ },
31
+ "./templates/*": {
32
+ "types": "./dist/src/templates/*.d.ts",
33
+ "import": "./dist/templates/*.js"
34
+ },
35
+ "./utils": {
36
+ "types": "./dist/src/utils.d.ts",
37
+ "import": "./dist/utils.js"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "src/tokens"
43
+ ],
44
+ "scripts": {
45
+ "build": "rslib build",
46
+ "build:storybook": "storybook build",
47
+ "dev": "rslib build --watch",
48
+ "storybook": "storybook dev",
49
+ "lint:tailwind": "eslint \"**/*.{js,jsx,ts,tsx}\" --config eslint.config.js",
50
+ "lint:tailwind:fix": "eslint \"**/*.{js,jsx,ts,tsx}\" --config eslint.config.js --fix",
51
+ "prepare": "pnpm build && pnpm build:storybook",
52
+ "check:unused-tokens": "bun scripts/check-unused-tokens.js",
53
+ "validate:tokens": "bun scripts/validate-token-usage.js && bun scripts/validate-token-definitions.js",
54
+ "validate:token-usage": "bun scripts/validate-token-usage.js",
55
+ "validate:token-definitions": "bun scripts/validate-token-definitions.js",
56
+ "semantic-release": "semantic-release"
57
+ },
58
+ "dependencies": {
59
+ "@zag-js/accordion": "^1.29.1",
60
+ "@zag-js/carousel": "^1.29.1",
61
+ "@zag-js/checkbox": "^1.29.1",
62
+ "@zag-js/combobox": "^1.29.1",
63
+ "@zag-js/dialog": "^1.29.1",
64
+ "@zag-js/i18n-utils": "^1.29.1",
65
+ "@zag-js/menu": "^1.29.1",
66
+ "@zag-js/number-input": "^1.29.1",
67
+ "@zag-js/pagination": "^1.29.1",
68
+ "@zag-js/popover": "^1.29.1",
69
+ "@zag-js/rating-group": "^1.29.1",
70
+ "@zag-js/react": "^1.29.1",
71
+ "@zag-js/select": "^1.29.1",
72
+ "@zag-js/slider": "^1.29.1",
73
+ "@zag-js/steps": "^1.29.1",
74
+ "@zag-js/switch": "^1.29.1",
75
+ "@zag-js/tabs": "^1.29.1",
76
+ "@zag-js/toast": "^1.29.1",
77
+ "@zag-js/tooltip": "^1.29.1",
78
+ "@zag-js/tree-view": "^1.29.1",
79
+ "tailwind-variants": "^3.1.1"
80
+ },
81
+ "devDependencies": {
82
+ "@eslint/js": "^9.39.1",
83
+ "@iconify/json": "^2.2.409",
84
+ "@iconify/tailwind4": "^1.1.0",
85
+ "@rsbuild/core": "1.6.7",
86
+ "@rsbuild/plugin-react": "^1.4.1",
87
+ "@rslib/core": "^0.18.0",
88
+ "@semantic-release/changelog": "^6.0.3",
89
+ "@semantic-release/commit-analyzer": "^13.0.1",
90
+ "@semantic-release/git": "^10.0.1",
91
+ "@semantic-release/github": "^12.0.2",
92
+ "@semantic-release/npm": "^13.1.2",
93
+ "@semantic-release/release-notes-generator": "^14.1.0",
94
+ "@storybook/addon-a11y": "^10.0.3",
95
+ "@storybook/addon-links": "^10.0.2",
96
+ "@storybook/addon-onboarding": "^10.0.2",
97
+ "@storybook/addon-themes": "^10.0.2",
98
+ "@storybook/react": "^10.0.2",
99
+ "@tailwindcss/postcss": "^4.1.17",
100
+ "@typescript-eslint/parser": "^8.47.0",
101
+ "class-variance-authority": "^0.7.1",
102
+ "clsx": "^2.1.1",
103
+ "eslint": "^9.39.1",
104
+ "eslint-plugin-tailwindcss": "beta",
105
+ "glob": "^11.0.2",
106
+ "next": "^16.0.3",
107
+ "rsbuild-plugin-publint": "^0.3.3",
108
+ "semantic-release": "^25.0.2",
109
+ "storybook": "^10.0.2",
110
+ "storybook-addon-rslib": "^2.1.6",
111
+ "storybook-react-rsbuild": "^2.1.4",
112
+ "tailwind-merge": "^3.4.0",
113
+ "tailwindcss": "^4.1.17",
114
+ "tailwindcss-animate": "^1.0.7",
115
+ "typescript": "^5.9.3"
116
+ },
117
+ "peerDependencies": {
118
+ "@types/react": ">=19.2.0",
119
+ "@types/react-dom": ">=19.2.0",
120
+ "react": ">=19.2.0",
121
+ "react-dom": ">=19.2.0"
122
+ },
123
+ "publishConfig": {
124
+ "access": "public"
125
+ }
126
+ }
@@ -0,0 +1,25 @@
1
+ @theme static {
2
+ /* Radius */
3
+ --radius-sm: 4px;
4
+ --radius-md: 8px;
5
+ --radius-lg: 12px;
6
+ --radius-full: 9999px;
7
+
8
+ --color-shadow-1: light-dark(rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 1));
9
+ --color-shadow-2: light-dark(rgba(0, 0, 0, 0.06), rgba(0, 0, 0, 1));
10
+ --color-shadow-3: light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 1));
11
+
12
+ --offset-shadow-1: 0px 1px 3px 0px;
13
+ --offset-shadow-2: 0px 5px 6px 0px;
14
+ --offset-shadow-3: 1px 1px 20px 0px;
15
+
16
+ --shadow-primary: var(--offset-shadow-1) var(--color-shadow-1),
17
+ var(--offset-shadow-2) var(--color-shadow-2), var(--offset-shadow-3)
18
+ var(--color-shadow-3);
19
+
20
+ /* Shadows */
21
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
22
+ --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
23
+ --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
24
+ --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.04);
25
+ }
@@ -0,0 +1,5 @@
1
+ /*
2
+ Tailwind 4 automatically provides default variables, including a wide range of colors
3
+ https://tailwindcss.com/docs/theme#default-theme-variable-reference
4
+ This file is reserved for other specific colours.
5
+ */
@@ -0,0 +1,34 @@
1
+ @theme static {
2
+ /* === BREAKPOINTS === */
3
+ --breakpoint-xs: 30rem;
4
+ --breakpoint-sm: 40rem;
5
+ --breakpoint-md: 48rem;
6
+ --breakpoint-lg: 64rem;
7
+ --breakpoint-xl: 80rem;
8
+ --breakpoint-2xl: 96rem;
9
+
10
+ /* === CONTAINER SIZES === */
11
+ --container-3xs: 16rem;
12
+ --container-2xs: 18rem;
13
+ --container-xs: 20rem;
14
+ --container-sm: 24rem;
15
+ --container-md: 28rem;
16
+ --container-lg: 32rem;
17
+ --container-xl: 36rem;
18
+ --container-2xl: 42rem;
19
+ --container-3xl: 48rem;
20
+ --container-4xl: 56rem;
21
+ --container-5xl: 64rem;
22
+ --container-6xl: 72rem;
23
+ --container-max-w: 80rem;
24
+ --container-prose: 65ch;
25
+
26
+ /* === ASPECT RATIOS === */
27
+ --aspect-square: 1;
28
+ --aspect-video: 16 / 9;
29
+ --aspect-portrait: 9 / 16;
30
+ --aspect-landscape: 4 / 3;
31
+ --aspect-wide: 21 / 9;
32
+ --aspect-card: 3 / 2;
33
+ --aspect-golden: 1.618;
34
+ }
@@ -0,0 +1,360 @@
1
+ /*
2
+ * Color manipulation functions:
3
+ * - oklch(from var(--color) calc(l + 0.1) c h): Modifies the lightness of a color while preserving
4
+ * its chroma and hue. Used for consistent hover/active states.
5
+ * - --alpha(var(--color) / 50%): Adjusts transparency of a color. Tailwind's v4 utility
6
+ * that compiles to color-mix() for better browser support.
7
+ */
8
+ :root {
9
+ --state-hover: -0.08;
10
+ --state-active: -0.12;
11
+ --state-disabled-chroma: 0.01;
12
+ --state-light-variant: 0.1; /* Always make colors lighter for -light variant */
13
+ --state-light-chroma: 0.6; /* Reduce saturation for softer, pastel colors */
14
+ --state-secondary-text: 0.15;
15
+ --state-border: 15%;
16
+ --max-lightness: 0.97;
17
+ --opacity-ring: 80%;
18
+ --opacity-disabled: 60%;
19
+ --opacity-placeholder: 60%;
20
+ --opacity-text-secondary: 70%;
21
+ --opacity-disabled-placeholder: 30%;
22
+ --fill-increment: 5%;
23
+ --surface-increment: 0.05;
24
+ }
25
+
26
+ /* Explicit Dark class(es) */
27
+ :is(.dark, .always-dark) {
28
+ --state-hover: 0.08;
29
+ --state-active: 0.12;
30
+ --state-secondary-text: -0.15;
31
+ --surface-increment: -0.05;
32
+ }
33
+
34
+ /* System Dark preference (when no explicit class forces light) */
35
+ @media (prefers-color-scheme: dark) {
36
+ :root:not(.light):not(.always-light) {
37
+ --state-hover: 0.08;
38
+ --state-active: 0.12;
39
+ --state-secondary-text: -0.15;
40
+ --surface-increment: -0.05;
41
+ }
42
+ }
43
+
44
+ /* Reverse if parents has .always-light/dark and we want to make reverse style to parent */
45
+ :is(.light, .always-light) .reverse {
46
+ --state-hover: 0.08;
47
+ --state-active: 0.12;
48
+ --state-secondary-text: -0.15;
49
+ --surface-increment: -0.05;
50
+ }
51
+
52
+ :is(.dark, .always-dark) .reverse {
53
+ --state-hover: -0.08;
54
+ --state-active: -0.12;
55
+ --state-secondary-text: 0.15;
56
+ --surface-increment: 0.05;
57
+ }
58
+
59
+ /* Reverse on System Light/Dark preference (when no explicit theme class is present) */
60
+ @media (prefers-color-scheme: light) {
61
+ .reverse:not(.dark):not(.always-dark):not(.light):not(.always-light) {
62
+ --state-hover: 0.08;
63
+ --state-active: 0.12;
64
+ --state-secondary-text: -0.15;
65
+ --surface-increment: -0.05;
66
+ }
67
+ }
68
+
69
+ @media (prefers-color-scheme: dark) {
70
+ .reverse:not(.dark):not(.always-dark):not(.light):not(.always-light) {
71
+ --state-hover: -0.08;
72
+ --state-active: -0.12;
73
+ --state-secondary-text: 0.15;
74
+ --surface-increment: 0.05;
75
+ }
76
+ }
77
+
78
+ /* === TAILWIND UTILITY VARIABLES === */
79
+ @theme static {
80
+ /* Colors */
81
+ /* User interface main tone and interactive colors, usually used for main operation button, etc */
82
+ --color-primary: light-dark(var(--color-blue-500), var(--color-sky-300));
83
+ --color-primary-hover: oklch(
84
+ from var(--color-primary) calc(l + var(--state-hover)) c h
85
+ );
86
+ --color-primary-active: oklch(
87
+ from var(--color-primary) calc(l + var(--state-active)) c h
88
+ );
89
+ --color-primary-disabled: oklch(
90
+ from var(--color-primary) l var(--state-disabled-chroma) h
91
+ );
92
+ --color-primary-light: oklch(
93
+ from var(--color-primary)
94
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
95
+ calc(c * var(--state-light-chroma)) h
96
+ );
97
+ --color-primary-light-hover: oklch(
98
+ from var(--color-primary-light) calc(l + var(--state-hover)) c h
99
+ );
100
+ --color-primary-light-active: oklch(
101
+ from var(--color-primary-light) calc(l + var(--state-active)) c h
102
+ );
103
+ --color-primary-light-disabled: oklch(
104
+ from var(--color-primary-light) l var(--state-disabled-chroma) h
105
+ );
106
+
107
+ /*Secondary colors. Less important than primary colors, but still serve as accents.*/
108
+ --color-secondary: light-dark(var(--color-orange-500), var(--color-amber-400));
109
+ --color-secondary-hover: oklch(
110
+ from var(--color-secondary) calc(l + var(--state-hover)) c h
111
+ );
112
+ --color-secondary-active: oklch(
113
+ from var(--color-secondary) calc(l + var(--state-active)) c h
114
+ );
115
+ --color-secondary-disabled: oklch(
116
+ from var(--color-secondary) l var(--state-disabled-chroma) h
117
+ );
118
+ --color-secondary-light: oklch(
119
+ from var(--color-secondary)
120
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
121
+ calc(c * var(--state-light-chroma)) h
122
+ );
123
+ --color-secondary-light-hover: oklch(
124
+ from var(--color-secondary-light) calc(l + var(--state-hover)) c h
125
+ );
126
+ --color-secondary-light-active: oklch(
127
+ from var(--color-secondary-light) calc(l + var(--state-active)) c h
128
+ );
129
+ --color-secondary-light-disabled: oklch(
130
+ from var(--color-secondary-light) l var(--state-disabled-chroma) h
131
+ );
132
+
133
+ /* In the user interface, non emphasis color and interactive color are usually used for general and non emphasis function operation buttons */
134
+ --color-tertiary: light-dark(var(--color-pink-500), var(--color-rose-400));
135
+ --color-tertiary-hover: oklch(
136
+ from var(--color-tertiary) calc(l + var(--state-hover)) c h
137
+ );
138
+ --color-tertiary-active: oklch(
139
+ from var(--color-tertiary) calc(l + var(--state-active)) c h
140
+ );
141
+ --color-tertiary-disabled: oklch(
142
+ from var(--color-tertiary) l var(--state-disabled-chroma) h
143
+ );
144
+ --color-tertiary-light: oklch(
145
+ from var(--color-tertiary)
146
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
147
+ calc(c * var(--state-light-chroma)) h
148
+ );
149
+ --color-tertiary-light-hover: oklch(
150
+ from var(--color-tertiary-light) calc(l + var(--state-hover)) c h
151
+ );
152
+ --color-tertiary-light-active: oklch(
153
+ from var(--color-tertiary-light) calc(l + var(--state-active)) c h
154
+ );
155
+ --color-tertiary-light-disabled: oklch(
156
+ from var(--color-tertiary-light) l var(--state-disabled-chroma) h
157
+ );
158
+
159
+ /* It is usually used to express the success, completion and opening status, and is used in scenarios with the above semantics */
160
+ --color-success: light-dark(
161
+ var(--color-emerald-500),
162
+ var(--color-emerald-300)
163
+ );
164
+ --color-success-hover: oklch(
165
+ from var(--color-success) calc(l + var(--state-hover)) c h
166
+ );
167
+ --color-success-active: oklch(
168
+ from var(--color-success) calc(l + var(--state-active)) c h
169
+ );
170
+ --color-success-disabled: oklch(
171
+ from var(--color-success) l var(--state-disabled-chroma) h
172
+ );
173
+ --color-success-light: oklch(
174
+ from var(--color-success)
175
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
176
+ calc(c * var(--state-light-chroma)) h
177
+ );
178
+ --color-success-light-hover: oklch(
179
+ from var(--color-success-light) calc(l + var(--state-hover)) c h
180
+ );
181
+ --color-success-light-active: oklch(
182
+ from var(--color-success-light) calc(l + var(--state-active)) c h
183
+ );
184
+ --color-success-light-disabled: oklch(
185
+ from var(--color-success-light) l var(--state-disabled-chroma) h
186
+ );
187
+
188
+ /* It is usually used to express objective and neutral information in the context with the above semantics */
189
+ --color-info: light-dark(var(--color-teal-500), var(--color-cyan-300));
190
+ --color-info-hover: oklch(
191
+ from var(--color-info) calc(l + var(--state-hover)) c h
192
+ );
193
+ --color-info-active: oklch(
194
+ from var(--color-info) calc(l + var(--state-active)) c h
195
+ );
196
+ --color-info-disabled: oklch(
197
+ from var(--color-info) l var(--state-disabled-chroma) h
198
+ );
199
+ --color-info-light: oklch(
200
+ from var(--color-info)
201
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
202
+ calc(c * var(--state-light-chroma)) h
203
+ );
204
+ --color-info-light-hover: oklch(
205
+ from var(--color-info-light) calc(l + var(--state-hover)) c h
206
+ );
207
+ --color-info-light-active: oklch(
208
+ from var(--color-info-light) calc(l + var(--state-active)) c h
209
+ );
210
+ --color-info-light-disabled: oklch(
211
+ from var(--color-info-light) l var(--state-disabled-chroma) h
212
+ );
213
+
214
+ /* It is usually used to express warning and unsafe state, and is used in scenarios with the above semantics */
215
+ --color-warning: light-dark(var(--color-yellow-500), var(--color-yellow-400));
216
+ --color-warning-hover: oklch(
217
+ from var(--color-warning) calc(l + var(--state-hover)) c h
218
+ );
219
+ --color-warning-active: oklch(
220
+ from var(--color-warning) calc(l + var(--state-active)) c h
221
+ );
222
+ --color-warning-disabled: oklch(
223
+ from var(--color-warning) l var(--state-disabled-chroma) h
224
+ );
225
+ --color-warning-light: oklch(
226
+ from var(--color-warning)
227
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
228
+ calc(c * var(--state-light-chroma)) h
229
+ );
230
+ --color-warning-light-hover: oklch(
231
+ from var(--color-warning-light) calc(l + var(--state-hover)) c h
232
+ );
233
+ --color-warning-light-active: oklch(
234
+ from var(--color-warning-light) calc(l + var(--state-active)) c h
235
+ );
236
+ --color-warning-light-disabled: oklch(
237
+ from var(--color-warning-light) l var(--state-disabled-chroma) h
238
+ );
239
+
240
+ /* It is usually used to express the dangerous state, and is used in the scene with the above semantics */
241
+ --color-danger: light-dark(var(--color-red-500), var(--color-red-400));
242
+ --color-danger-hover: oklch(
243
+ from var(--color-danger) calc(l + var(--state-hover)) c h
244
+ );
245
+ --color-danger-active: oklch(
246
+ from var(--color-danger) calc(l + var(--state-active)) c h
247
+ );
248
+ --color-danger-disabled: oklch(
249
+ from var(--color-danger) l var(--state-disabled-chroma) h
250
+ );
251
+ --color-danger-light: oklch(
252
+ from var(--color-danger)
253
+ min(var(--max-lightness), calc(l + var(--state-light-variant)))
254
+ calc(c * var(--state-light-chroma)) h
255
+ );
256
+ --color-danger-light-hover: oklch(
257
+ from var(--color-danger-light) calc(l + var(--state-hover)) c h
258
+ );
259
+ --color-danger-light-active: oklch(
260
+ from var(--color-danger-light) calc(l + var(--state-active)) c h
261
+ );
262
+ --color-danger-light-disabled: oklch(
263
+ from var(--color-danger-light) l var(--state-disabled-chroma) h
264
+ );
265
+
266
+ /* Text colors and Icon colors*/
267
+ /* Four different levels of text / icon colors represent the most important, secondary, minor and minor contents in the product interface */
268
+ --color-fg-light: var(--color-slate-800); /* Light mode */
269
+ --color-fg-dark: var(--color-white); /* Dark mode */
270
+ --color-fg-primary: light-dark(var(--color-fg-light), var(--color-fg-dark));
271
+
272
+ --color-fg-secondary: oklch(
273
+ from var(--color-fg-primary) calc(l + var(--state-secondary-text)) c h
274
+ );
275
+ --color-fg-reverse: light-dark(var(--color-fg-dark), var(--color-fg-light));
276
+
277
+ /* Background colors */
278
+ /* All levels of background color in the application, including container, menu, navigation bar, etc. In dark mode, we usually use the background color to distinguish the front and back levels */
279
+ --color-base-light: var(--color-white);
280
+ --color-base-dark: var(--color-gray-950);
281
+ --color-base: light-dark(var(--color-base-light), var(--color-base-dark)); /*bottom page*/
282
+ --color-surface: oklch(
283
+ from var(--color-base) calc(l - var(--surface-increment)) c h
284
+ ); /* content that needs to be promoted on the page*/
285
+ --color-overlay: oklch(
286
+ from var(--color-base) calc(l - var(--surface-increment) * 2) c h
287
+ ); /* containers, modals*/
288
+ --color-float: oklch(
289
+ from var(--color-base) calc(l - var(--surface-increment) * 3) c h
290
+ ); /* toast */
291
+ --color-highlight: oklch(
292
+ from var(--color-base) calc(l - var(--surface-increment) * 4) c h
293
+ ); /* top layer */
294
+ --color-base-reverse: light-dark(
295
+ var(--color-base-dark),
296
+ var(--color-base-light)
297
+ );
298
+
299
+ /* Borders */
300
+ --color-border-primary: --alpha(
301
+ var(--color-base-reverse) /
302
+ var(--state-border)
303
+ );
304
+ --color-border-secondary: --alpha(
305
+ var(--color-base-reverse) /
306
+ calc(var(--state-border) * 1.5)
307
+ );
308
+ --border-width-none: 0px;
309
+ --border-width-sm: 1px;
310
+ --border-width-md: 2px;
311
+ --border-width-lg: 3px;
312
+
313
+ /* Links */
314
+ --color-link: light-dark(var(--color-blue-500), var(--color-sky-300));
315
+ --color-link-hover: oklch(
316
+ from var(--color-link) calc(l + var(--state-hover)) c h
317
+ );
318
+ --color-link-active: oklch(
319
+ from var(--color-link) calc(l + var(--state-active)) c h
320
+ );
321
+ --color-link-visited: oklch(
322
+ from var(--color-link) calc(l - var(--state-hover)) c h
323
+ );
324
+
325
+ /* Fill Color*/
326
+ /* For an element, if the background color of its container is not fixed, and the contrast between the filling color of the element and the top background color is small, use the filling color as the background color to ensure that the element will not "melt" into a certain level of background color, such as a form control. */
327
+ --color-fill-base: --alpha(var(--color-base-reverse) / var(--fill-increment));
328
+ --color-fill-hover: --alpha(
329
+ var(--color-base-reverse) /
330
+ calc(var(--fill-increment) * 2)
331
+ );
332
+ --color-fill-active: --alpha(
333
+ var(--color-base-reverse) /
334
+ calc(var(--fill-increment) * 3)
335
+ );
336
+
337
+ /*Disabled state - Disabled
338
+ It is used to fill all kinds of forbidden elements in the interface, such as background, text, stroke, fill, etc*/
339
+ --color-disabled-bg: --alpha(var(--color-base-reverse) / 10%);
340
+ --color-disabled-fg: --alpha(
341
+ var(--color-fg-primary) /
342
+ var(--opacity-disabled)
343
+ );
344
+ --color-disabled-border: --alpha(
345
+ var(--color-border-primary) /
346
+ var(--opacity-disabled)
347
+ );
348
+ --color-disabled-fill: --alpha(
349
+ var(--color-fill-base) /
350
+ var(--opacity-disabled)
351
+ );
352
+
353
+ /* Spacing */
354
+ --spacing: 0.25rem;
355
+
356
+ /* Focus ring */
357
+ --default-ring-color: light-dark(var(--color-black), var(--color-white));
358
+ --color-ring: var(--default-ring-color);
359
+ --default-ring-width: 3px;
360
+ }
@@ -0,0 +1,22 @@
1
+ @theme static {
2
+ /* Primitive Spacing Tokens - Utopia Fluid Scale (50-950) */
3
+ --spacing-50: clamp(0.125rem, 0.1033rem + 0.1087vw, 0.1875rem);
4
+ --spacing-100: clamp(0.3125rem, 0.3125rem + 0vw, 0.3125rem);
5
+ --spacing-150: clamp(0.5625rem, 0.5408rem + 0.1087vw, 0.625rem);
6
+ --spacing-200: clamp(0.875rem, 0.8533rem + 0.1087vw, 0.9375rem);
7
+ --spacing-250: clamp(1.125rem, 1.0815rem + 0.2174vw, 1.25rem);
8
+ --spacing-300: clamp(1.4375rem, 1.394rem + 0.2174vw, 1.5625rem);
9
+ --spacing-350: clamp(1.6875rem, 1.6223rem + 0.3261vw, 1.875rem);
10
+ --spacing-400: clamp(2rem, 1.9348rem + 0.3261vw, 2.1875rem);
11
+ --spacing-450: clamp(2.25rem, 2.163rem + 0.4348vw, 2.5rem);
12
+ --spacing-500: clamp(2.5625rem, 2.4755rem + 0.4348vw, 2.8125rem);
13
+ --spacing-550: clamp(2.8125rem, 2.7038rem + 0.5435vw, 3.125rem);
14
+ --spacing-600: clamp(3.375rem, 3.2446rem + 0.6522vw, 3.75rem);
15
+ --spacing-650: clamp(3.6875rem, 3.5571rem + 0.6522vw, 4.0625rem);
16
+ --spacing-700: clamp(3.9375rem, 3.7853rem + 0.7609vw, 4.375rem);
17
+ --spacing-750: clamp(4.5rem, 4.3261rem + 0.8696vw, 5rem);
18
+ --spacing-800: clamp(5.0625rem, 4.8668rem + 0.9783vw, 5.625rem);
19
+ --spacing-850: clamp(5.625rem, 5.4076rem + 1.087vw, 6.25rem);
20
+ --spacing-900: clamp(6.1875rem, 5.9484rem + 1.1957vw, 6.875rem);
21
+ --spacing-950: clamp(6.75rem, 6.4891rem + 1.3043vw, 7.5rem);
22
+ }
@@ -0,0 +1,17 @@
1
+ @theme static {
2
+ /* Primitive Typography Tokens - Utopia fluid typography */
3
+ --text-xs: clamp(0.7813rem, 0.7747rem + 0.0326vw, 0.8rem); /* 12.5px - 12.8px */
4
+ --text-sm: clamp(0.9375rem, 0.9158rem + 0.1087vw, 1rem); /* 15px - 16px */
5
+ --text-md: clamp(1.125rem, 1.0815rem + 0.2174vw, 1.25rem); /* 18px - 20px */
6
+ --text-lg: clamp(1.35rem, 1.2761rem + 0.3696vw, 1.5625rem); /* 21.6px - 25px */
7
+ --text-xl: clamp(1.62rem, 1.5041rem + 0.5793vw, 1.9531rem); /* 25.92px - 31.25px */
8
+ --text-2xl: clamp(1.944rem, 1.771rem + 0.8651vw, 2.4414rem); /* 31.1px - 39.06px */
9
+ --text-3xl: clamp(2.3328rem, 2.0827rem + 1.2504vw, 3.0518rem); /* 37.32px - 48.83px */
10
+ --text-4xl: clamp(2.7994rem, 2.4462rem + 1.7658vw, 3.8147rem); /* 44.79px - 61.04px */
11
+
12
+ /* === TEXT WEIGHT === */
13
+ --font-weight-normal: 400;
14
+ --font-weight-medium: 500;
15
+ --font-weight-semibold: 600;
16
+ --font-weight-bold: 700;
17
+ }