@justanarthur/modo-ui 0.0.0-stage → 0.2.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE.beui +21 -0
  3. package/LICENSE.fluid-functionalism +21 -0
  4. package/LICENSE.motion-primitives +21 -0
  5. package/LICENSE.sileo +21 -0
  6. package/README.md +608 -2
  7. package/dist/base.css +994 -0
  8. package/dist/blocks/sidebar-app/index.d.ts +34 -0
  9. package/dist/blocks/sidebar-app/index.js +31 -0
  10. package/dist/components/badge/index.d.ts +59 -0
  11. package/dist/components/badge/index.js +16 -0
  12. package/dist/components/button/index.d.ts +59 -0
  13. package/dist/components/button/index.js +14 -0
  14. package/dist/components/card/index.d.ts +141 -0
  15. package/dist/components/card/index.js +42 -0
  16. package/dist/components/inputs/checkbox-group/index.d.ts +50 -0
  17. package/dist/components/inputs/checkbox-group/index.js +21 -0
  18. package/dist/components/inputs/color-picker/index.d.ts +137 -0
  19. package/dist/components/inputs/color-picker/index.js +35 -0
  20. package/dist/components/inputs/combobox/index.d.ts +161 -0
  21. package/dist/components/inputs/combobox/index.js +38 -0
  22. package/dist/components/inputs/date-time/calendar/index.d.ts +45 -0
  23. package/dist/components/inputs/date-time/calendar/index.js +18 -0
  24. package/dist/components/inputs/date-time/date-picker/index.d.ts +82 -0
  25. package/dist/components/inputs/date-time/date-picker/index.js +32 -0
  26. package/dist/components/inputs/date-time/date-range-picker/index.d.ts +64 -0
  27. package/dist/components/inputs/date-time/date-range-picker/index.js +31 -0
  28. package/dist/components/inputs/date-time/duration-picker/index.d.ts +57 -0
  29. package/dist/components/inputs/date-time/duration-picker/index.js +31 -0
  30. package/dist/components/inputs/date-time/month-picker/index.d.ts +57 -0
  31. package/dist/components/inputs/date-time/month-picker/index.js +30 -0
  32. package/dist/components/inputs/date-time/time-picker/index.d.ts +59 -0
  33. package/dist/components/inputs/date-time/time-picker/index.js +31 -0
  34. package/dist/components/inputs/input/index.d.ts +84 -0
  35. package/dist/components/inputs/input/index.js +19 -0
  36. package/dist/components/inputs/input-copy/index.d.ts +44 -0
  37. package/dist/components/inputs/input-copy/index.js +16 -0
  38. package/dist/components/inputs/input-message/index.d.ts +125 -0
  39. package/dist/components/inputs/input-message/index.js +25 -0
  40. package/dist/components/inputs/radio-group/index.d.ts +58 -0
  41. package/dist/components/inputs/radio-group/index.js +20 -0
  42. package/dist/components/inputs/search/index.d.ts +83 -0
  43. package/dist/components/inputs/search/index.js +25 -0
  44. package/dist/components/inputs/select/index.d.ts +105 -0
  45. package/dist/components/inputs/select/index.js +34 -0
  46. package/dist/components/inputs/slider/index.d.ts +108 -0
  47. package/dist/components/inputs/slider/index.js +14 -0
  48. package/dist/components/inputs/switch/index.d.ts +43 -0
  49. package/dist/components/inputs/switch/index.js +14 -0
  50. package/dist/components/navigation/accordion/index.d.ts +117 -0
  51. package/dist/components/navigation/accordion/index.js +28 -0
  52. package/dist/components/navigation/sidebar/index.d.ts +388 -0
  53. package/dist/components/navigation/sidebar/index.js +99 -0
  54. package/dist/components/navigation/tabs/index.d.ts +70 -0
  55. package/dist/components/navigation/tabs/index.js +23 -0
  56. package/dist/components/navigation/tabs-subtle/index.d.ts +73 -0
  57. package/dist/components/navigation/tabs-subtle/index.js +21 -0
  58. package/dist/components/overlays/alert-dialog/index.d.ts +67 -0
  59. package/dist/components/overlays/alert-dialog/index.js +22 -0
  60. package/dist/components/overlays/command/index.d.ts +121 -0
  61. package/dist/components/overlays/command/index.js +36 -0
  62. package/dist/components/overlays/context-menu/index.d.ts +97 -0
  63. package/dist/components/overlays/context-menu/index.js +29 -0
  64. package/dist/components/overlays/dialog/index.d.ts +130 -0
  65. package/dist/components/overlays/dialog/index.js +37 -0
  66. package/dist/components/overlays/dropdown/index.d.ts +222 -0
  67. package/dist/components/overlays/dropdown/index.js +44 -0
  68. package/dist/components/overlays/popover/index.d.ts +87 -0
  69. package/dist/components/overlays/popover/index.js +26 -0
  70. package/dist/components/overlays/preview-card/index.d.ts +75 -0
  71. package/dist/components/overlays/preview-card/index.js +19 -0
  72. package/dist/components/overlays/sheet/index.d.ts +67 -0
  73. package/dist/components/overlays/sheet/index.js +24 -0
  74. package/dist/components/overlays/toast/index.d.ts +107 -0
  75. package/dist/components/overlays/toast/index.js +21 -0
  76. package/dist/components/overlays/tooltip/index.d.ts +75 -0
  77. package/dist/components/overlays/tooltip/index.js +17 -0
  78. package/dist/components/table/index.d.ts +44 -0
  79. package/dist/components/table/index.js +26 -0
  80. package/dist/components/thinking-indicator/index.d.ts +32 -0
  81. package/dist/components/thinking-indicator/index.js +13 -0
  82. package/dist/index.d.ts +3926 -0
  83. package/dist/index.js +511 -0
  84. package/dist/preset.d.ts +104 -0
  85. package/dist/preset.js +124 -0
  86. package/dist/primitives/code/index.d.ts +23 -0
  87. package/dist/primitives/code/index.js +11 -0
  88. package/dist/primitives/craft/index.d.ts +31 -0
  89. package/dist/primitives/craft/index.js +11 -0
  90. package/dist/primitives/fluid-hover/index.d.ts +233 -0
  91. package/dist/primitives/fluid-hover/index.js +25 -0
  92. package/dist/primitives/morph/index.d.ts +127 -0
  93. package/dist/primitives/morph/index.js +19 -0
  94. package/dist/primitives/motion/index.d.ts +115 -0
  95. package/dist/primitives/motion/index.js +19 -0
  96. package/dist/primitives/scroll-area/index.d.ts +41 -0
  97. package/dist/primitives/scroll-area/index.js +12 -0
  98. package/dist/primitives/sizes/index.d.ts +128 -0
  99. package/dist/primitives/sizes/index.js +21 -0
  100. package/dist/primitives/surface/index.d.ts +69 -0
  101. package/dist/primitives/surface/index.js +17 -0
  102. package/dist/shared/components-0ke6xada.js +123 -0
  103. package/dist/shared/components-0q0sqfh4.js +146 -0
  104. package/dist/shared/components-0sn7ypjw.js +61 -0
  105. package/dist/shared/components-1j9791sn.js +345 -0
  106. package/dist/shared/components-1rfwbyyc.js +361 -0
  107. package/dist/shared/components-1v7rxytx.js +30 -0
  108. package/dist/shared/components-1xekx2hx.js +215 -0
  109. package/dist/shared/components-39jq9va1.js +86 -0
  110. package/dist/shared/components-3gae8nta.js +719 -0
  111. package/dist/shared/components-3k8xpnpq.js +1759 -0
  112. package/dist/shared/components-3ky44908.js +9 -0
  113. package/dist/shared/components-3mkepka5.js +111 -0
  114. package/dist/shared/components-3wk0w46f.js +667 -0
  115. package/dist/shared/components-4cnjmgex.js +124 -0
  116. package/dist/shared/components-59efxjd9.js +298 -0
  117. package/dist/shared/components-5xc2j8jz.js +159 -0
  118. package/dist/shared/components-62ybc7t2.js +496 -0
  119. package/dist/shared/components-66mv71kx.js +262 -0
  120. package/dist/shared/components-7ans7ce5.js +120 -0
  121. package/dist/shared/components-7btqt08d.js +270 -0
  122. package/dist/shared/components-7r3etddy.js +171 -0
  123. package/dist/shared/components-7x9kawxv.js +152 -0
  124. package/dist/shared/components-8fpr3s4p.js +292 -0
  125. package/dist/shared/components-9jvzzvt1.js +198 -0
  126. package/dist/shared/components-apdwtweq.js +484 -0
  127. package/dist/shared/components-asr5pg50.js +191 -0
  128. package/dist/shared/components-b2wyq2cq.js +232 -0
  129. package/dist/shared/components-c6s6b43g.js +15 -0
  130. package/dist/shared/components-ca2c898n.js +1828 -0
  131. package/dist/shared/components-cbxjn9p8.js +141 -0
  132. package/dist/shared/components-chacnk61.js +216 -0
  133. package/dist/shared/components-cv16mryv.js +62 -0
  134. package/dist/shared/components-ez65vtbq.js +110 -0
  135. package/dist/shared/components-ezxhrmer.js +17 -0
  136. package/dist/shared/components-gc5vtq2f.js +149 -0
  137. package/dist/shared/components-gf5s6ap9.js +42 -0
  138. package/dist/shared/components-gvr9w41t.js +193 -0
  139. package/dist/shared/components-h2dpcwgc.js +137 -0
  140. package/dist/shared/components-hawvy2qz.js +105 -0
  141. package/dist/shared/components-hqeq3w9q.js +375 -0
  142. package/dist/shared/components-jjw69c4c.js +28 -0
  143. package/dist/shared/components-jwst3vtj.js +346 -0
  144. package/dist/shared/components-kvr7f9hy.js +45 -0
  145. package/dist/shared/components-men63rwj.js +9 -0
  146. package/dist/shared/components-mhd39z7x.js +22 -0
  147. package/dist/shared/components-n7mjr357.js +26 -0
  148. package/dist/shared/components-ng72k97e.js +128 -0
  149. package/dist/shared/components-nh8tma1n.js +986 -0
  150. package/dist/shared/components-njzgqdwy.js +445 -0
  151. package/dist/shared/components-ny774h8p.js +293 -0
  152. package/dist/shared/components-q4daerx0.js +58 -0
  153. package/dist/shared/components-q5xj5c16.js +79 -0
  154. package/dist/shared/components-rr7a6ja9.js +160 -0
  155. package/dist/shared/components-s2bz1xpk.js +63 -0
  156. package/dist/shared/components-tqvarbfv.js +288 -0
  157. package/dist/shared/components-v6xp325t.js +304 -0
  158. package/dist/shared/components-v7wtz8hk.js +144 -0
  159. package/dist/shared/components-vc7vq5nz.js +32 -0
  160. package/dist/shared/components-vfbhxf5r.js +58 -0
  161. package/dist/shared/components-vynjtrk6.js +19 -0
  162. package/dist/shared/components-wvp1m52g.js +1200 -0
  163. package/dist/shared/components-yh3kwdhr.js +981 -0
  164. package/dist/shared/components-ytb2tefr.js +291 -0
  165. package/dist/shared/components-zfnmn5d4.js +220 -0
  166. package/dist/shared/components-zrkzcayz.js +141 -0
  167. package/dist/shared/components-zx6b6yby.js +42 -0
  168. package/dist/styles.css +1949 -0
  169. package/dist/tailwind.css +219 -0
  170. package/dist/tokens.css +345 -0
  171. package/package.json +103 -4
@@ -0,0 +1,219 @@
1
+ /* @justanarthur/modo-ui for Tailwind CSS v4: import after `@import "tailwindcss"`. */
2
+
3
+ @import "./base.css";
4
+
5
+ @source "./shared";
6
+
7
+ @source "./primitives";
8
+
9
+ @source "./components";
10
+
11
+ @source "./blocks";
12
+
13
+ @custom-variant dark (&:is(.dark *));
14
+
15
+ @theme inline {
16
+ --color-background: var(--background);
17
+ --color-foreground: var(--foreground);
18
+ --color-card: var(--card);
19
+ --color-card-foreground: var(--card-foreground);
20
+ --color-muted: var(--muted);
21
+ --color-muted-foreground: var(--muted-foreground);
22
+ --color-accent: var(--accent);
23
+ --color-accent-foreground: var(--accent-foreground);
24
+ --color-accent-hover: var(--accent-hover);
25
+ --color-brand: var(--brand);
26
+ --color-brand-hover: var(--brand-hover);
27
+ --color-focus-ring: var(--focus-ring);
28
+ --color-overlay: rgb(var(--overlay));
29
+ --color-selected: var(--selected);
30
+ --color-thumb: var(--thumb);
31
+ --color-picker-edge: var(--picker-edge);
32
+ --color-picker-ring: var(--picker-ring);
33
+ --color-control: var(--control-border);
34
+ --color-scrim: var(--scrim);
35
+ --color-status-success: var(--status-success);
36
+ --color-status-loading: var(--status-loading);
37
+ --color-status-error: var(--status-error);
38
+ --color-status-warning: var(--status-warning);
39
+ --color-status-info: var(--status-info);
40
+ --color-status-action: var(--status-action);
41
+ --color-border: var(--border);
42
+ --color-ring: var(--ring);
43
+ --color-input: var(--input);
44
+ --color-destructive: var(--destructive);
45
+ --color-destructive-light: var(--destructive-light);
46
+ --color-hover: var(--hover);
47
+ --color-active: var(--active);
48
+ --color-syntax-keyword: var(--syntax-keyword);
49
+ --color-syntax-string: var(--syntax-string);
50
+ --color-syntax-class: var(--syntax-class);
51
+ --color-syntax-entity: var(--syntax-entity);
52
+ --color-syntax-property: var(--syntax-property);
53
+ --color-syntax-comment: var(--syntax-comment);
54
+ --color-syntax-identifier: var(--syntax-identifier);
55
+ --color-syntax-jsx: var(--syntax-jsx);
56
+ --color-syntax-sign: var(--syntax-sign);
57
+ --color-surface-1: var(--surface-1);
58
+ --color-surface-2: var(--surface-2);
59
+ --color-surface-3: var(--surface-3);
60
+ --color-surface-4: var(--surface-4);
61
+ --color-surface-5: var(--surface-5);
62
+ --color-surface-6: var(--surface-6);
63
+ --color-surface-7: var(--surface-7);
64
+ --color-surface-8: var(--surface-8);
65
+ --shadow-surface-1: var(--shadow-1);
66
+ --shadow-surface-2: var(--shadow-2);
67
+ --shadow-surface-3: var(--shadow-3);
68
+ --shadow-surface-4: var(--shadow-4);
69
+ --shadow-surface-5: var(--shadow-5);
70
+ --shadow-surface-6: var(--shadow-6);
71
+ --shadow-surface-7: var(--shadow-7);
72
+ --shadow-surface-8: var(--shadow-8);
73
+ --shadow-thumb: var(--shadow-thumb);
74
+ --shadow-picker-thumb: var(--shadow-picker-thumb);
75
+ --shadow-picker-cursor: var(--shadow-picker-cursor);
76
+ --shadow-swatch: var(--shadow-swatch);
77
+ --shadow-swatch-hover: var(--shadow-swatch-hover);
78
+ --shadow-swatch-selected: var(--shadow-swatch-selected);
79
+ --drop-shadow-picker-cursor: var(--drop-shadow-picker-cursor);
80
+ }
81
+
82
+ @utility text-display {
83
+ font-size: var(--text-display);
84
+ line-height: var(--leading-display);
85
+ }
86
+
87
+ @utility text-display-compact {
88
+ font-size: var(--text-display-compact);
89
+ line-height: var(--leading-display);
90
+ }
91
+
92
+ @utility text-title {
93
+ font-size: var(--text-title);
94
+ line-height: var(--leading-title);
95
+ }
96
+
97
+ @utility text-title-compact {
98
+ font-size: var(--text-title-compact);
99
+ line-height: var(--leading-title);
100
+ }
101
+
102
+ @utility text-subtitle {
103
+ font-size: var(--text-subtitle);
104
+ line-height: var(--leading-subtitle);
105
+ }
106
+
107
+ @utility text-subtitle-compact {
108
+ font-size: var(--text-subtitle-compact);
109
+ line-height: var(--leading-subtitle);
110
+ }
111
+
112
+ @utility text-body {
113
+ font-size: var(--text-body);
114
+ line-height: var(--leading-body);
115
+ }
116
+
117
+ @utility text-body-compact {
118
+ font-size: var(--text-body-compact);
119
+ line-height: var(--leading-body);
120
+ }
121
+
122
+ @utility text-caption {
123
+ font-size: var(--text-caption);
124
+ line-height: var(--leading-caption);
125
+ }
126
+
127
+ @utility text-caption-compact {
128
+ font-size: var(--text-caption-compact);
129
+ line-height: var(--leading-caption);
130
+ }
131
+
132
+ @utility text-micro {
133
+ font-size: var(--text-micro);
134
+ line-height: var(--leading-micro);
135
+ }
136
+
137
+ @utility text-micro-compact {
138
+ font-size: var(--text-micro-compact);
139
+ line-height: var(--leading-micro);
140
+ }
141
+
142
+ @utility weight-normal {
143
+ font-variation-settings: var(--weight-normal);
144
+ }
145
+
146
+ @utility weight-medium {
147
+ font-variation-settings: var(--weight-medium);
148
+ }
149
+
150
+ @utility weight-semibold {
151
+ font-variation-settings: var(--weight-semibold);
152
+ }
153
+
154
+ @utility weight-bold {
155
+ font-variation-settings: var(--weight-bold);
156
+ }
157
+
158
+ @utility duration-fast {
159
+ --tw-duration: var(--duration-fast);
160
+ transition-duration: var(--duration-fast);
161
+ }
162
+
163
+ @utility delay-fast {
164
+ transition-delay: var(--duration-fast);
165
+ }
166
+
167
+ @utility duration-fast-exit {
168
+ --tw-duration: var(--duration-fast-exit);
169
+ transition-duration: var(--duration-fast-exit);
170
+ }
171
+
172
+ @utility delay-fast-exit {
173
+ transition-delay: var(--duration-fast-exit);
174
+ }
175
+
176
+ @utility duration-moderate {
177
+ --tw-duration: var(--duration-moderate);
178
+ transition-duration: var(--duration-moderate);
179
+ }
180
+
181
+ @utility delay-moderate {
182
+ transition-delay: var(--duration-moderate);
183
+ }
184
+
185
+ @utility duration-moderate-exit {
186
+ --tw-duration: var(--duration-moderate-exit);
187
+ transition-duration: var(--duration-moderate-exit);
188
+ }
189
+
190
+ @utility delay-moderate-exit {
191
+ transition-delay: var(--duration-moderate-exit);
192
+ }
193
+
194
+ @utility duration-slow {
195
+ --tw-duration: var(--duration-slow);
196
+ transition-duration: var(--duration-slow);
197
+ }
198
+
199
+ @utility delay-slow {
200
+ transition-delay: var(--duration-slow);
201
+ }
202
+
203
+ @utility duration-slow-exit {
204
+ --tw-duration: var(--duration-slow-exit);
205
+ transition-duration: var(--duration-slow-exit);
206
+ }
207
+
208
+ @utility delay-slow-exit {
209
+ transition-delay: var(--duration-slow-exit);
210
+ }
211
+
212
+ @utility rounded-box {
213
+ border-radius: var(--radius-box);
214
+ }
215
+
216
+ @utility rounded-glyph {
217
+ border-radius: var(--radius-glyph);
218
+ }
219
+
@@ -0,0 +1,345 @@
1
+ /*
2
+ * Fluid Functionalism color tokens.
3
+ *
4
+ * Source: mickadesign/fluid-functionalism `app/globals.css` §1 (DESIGN TOKENS)
5
+ * at commit b3587bdbd83fc66c2a6aae3817ffb856cb09260b — MIT License
6
+ * © 2026 Micka Touillaud — fluidfunctionalism.com.
7
+ *
8
+ * Migration from upstream: every HEX literal was converted to its exact oklch
9
+ * equivalent (sRGB → OKLab, round-trip verified to the original hex). The
10
+ * rgb()/rgba() alpha overlays (--overlay, --hover, --active, --shadow-color,
11
+ * --dm-*) are kept as-is — they are alpha contracts, not palette colors.
12
+ *
13
+ * Every color token is written ONCE, as light-dark(light, dark). Which side
14
+ * renders is driven by `color-scheme` (set in base.css): :root follows the
15
+ * OS, and a `.light` or `.dark` class pins it. The block is declared on
16
+ * `:root, .light, .dark` — not just `:root` — because light-dark() inside a
17
+ * custom property resolves against the color-scheme of the element the
18
+ * property is declared on, so a forced-scope subtree becomes its own
19
+ * resolution point.
20
+ *
21
+ * The surface ladder and its shadow recipes live with their primitive in
22
+ * primitives/surface/surface.css. The one token that cannot ride
23
+ * light-dark() here — the --overlay RGB triplet (consumed as
24
+ * rgb(var(--overlay) / α), an alpha contract) — is re-pointed per scheme in
25
+ * base.css.
26
+ */
27
+
28
+ :root,
29
+ .light,
30
+ .dark {
31
+ /* The surface ladder (--surface-1..8) and the shadow recipes pair with it
32
+ in primitives/surface/surface.css. */
33
+
34
+ /* ── Semantic tokens ── */
35
+ /* Same color as --surface-1, inlined so the global token set never
36
+ depends on the surface primitive's CSS being loaded. */
37
+ --background: light-dark(oklch(0.985 0 0), oklch(0.205 0 0));
38
+ --foreground: light-dark(oklch(0.205 0 0), oklch(0.97 0 0));
39
+ /* Same color as --surface-3, inlined for the same reason. */
40
+ --card: light-dark(oklch(1 0 0), oklch(0.264 0 0));
41
+ --card-foreground: light-dark(oklch(0.205 0 0), oklch(0.97 0 0));
42
+ /* Light `muted` decouples from surface-2: the light surface ladder is so
43
+ compressed that a ladder value would read as near-white, making anything
44
+ sitting on it blend together. A slightly greyer value gives muted real
45
+ semantic presence. Dark keeps the ladder value (= surface-2). */
46
+ --muted: light-dark(oklch(0.967 0.001 286.375), oklch(0.235 0 0));
47
+ --muted-foreground: light-dark(oklch(0.556 0 0), oklch(0.7155 0 0));
48
+
49
+ /* ── Interactive states ── */
50
+ --accent: light-dark(oklch(0.922 0 0), oklch(0.439 0 0));
51
+ --accent-foreground: light-dark(oklch(0.205 0 0), oklch(0.97 0 0));
52
+ /* --accent nudged toward the overlay direction (the switch track's hover). */
53
+ --accent-hover: color-mix(in oklab, var(--accent), rgb(var(--overlay)) 10%);
54
+ --selected: light-dark(oklch(0.87 0 0), oklch(0.439 0 0));
55
+
56
+ /* ── Borders ──
57
+ --border mixes from --foreground, so it tracks the theme automatically —
58
+ including inside nested forced scopes, where light-dark() re-resolves
59
+ --foreground before the mix happens. */
60
+ --border: color-mix(in oklab, var(--foreground) 12%, transparent);
61
+ --ring: light-dark(oklch(0.922 0 0), oklch(0.371 0 0));
62
+ --input: light-dark(oklch(0.922 0 0), oklch(0.371 0 0));
63
+
64
+ /* ── Error / Destructive ── */
65
+ --destructive: light-dark(oklch(0.6368 0.2078 25.33), oklch(0.7106 0.1661 22.22));
66
+ --destructive-light: light-dark(oklch(0.971 0.013 17.38), oklch(0.2575 0.0886 26.04));
67
+
68
+ /* ── Brand blue ──
69
+ FF's one chromatic accent: the switch's on-track, the copy field's hover
70
+ highlight, drop-target and selected-swatch rings. */
71
+ --brand: oklch(0.693 0.16 265);
72
+ --brand-hover: oklch(0.649 0.164 264.76);
73
+
74
+ /* ── Focus indicator ──
75
+ Every component focus ring reads it (`ring-focus-ring`,
76
+ `border-focus-ring`), so this is the single theming point. */
77
+ --focus-ring: var(--brand);
78
+
79
+ /* ── Alpha checkerboard (color-picker swatches) ── */
80
+ --checker-a: light-dark(oklch(0.792 0 0), oklch(0.239 0 0));
81
+ --checker-b: light-dark(oklch(1 0 0), oklch(0.285 0 0));
82
+ /* Swatch edges: a mid-grey hairline that reads on any swatch color in
83
+ either scheme, plus the hover / selected rings, set off by a
84
+ --background gap. */
85
+ --swatch-edge: rgb(127 127 127 / 0.25);
86
+ --swatch-edge-hover: rgb(127 127 127 / 0.4);
87
+ --shadow-swatch: inset 0 0 0 1px var(--swatch-edge);
88
+ --shadow-swatch-hover: var(--shadow-swatch), 0 0 0 2px var(--background), 0 0 0 4px var(--swatch-edge-hover);
89
+ --shadow-swatch-selected: var(--shadow-swatch), 0 0 0 2px var(--background), 0 0 0 4px var(--brand);
90
+
91
+ /* ── Thumbs (switch, slider) ──
92
+ White in both schemes, set off by a soft drop. */
93
+ --thumb: oklch(1 0 0);
94
+ --shadow-thumb: 0 1px 2px rgb(0 0 0 / 0.1);
95
+
96
+ /* ── Color picker affordances ──
97
+ Drawn over any user color, so fixed white and black rather than theme
98
+ colors: they have to read on every fill, in either scheme. */
99
+ --picker-edge: oklch(0 0 0);
100
+ --picker-ring: oklch(1 0 0 / 0.55);
101
+ --picker-thumb-border: oklch(1 0 0 / 0.9);
102
+ --shadow-picker-thumb: 0 0 0 1px var(--picker-edge);
103
+ --shadow-picker-cursor: 0 0 0 1px oklch(0 0 0 / 0.2);
104
+ --drop-shadow-picker-cursor: 0 1px 1px oklch(0 0 0 / 0.4);
105
+
106
+ /* ── Controls ──
107
+ An unchecked checkbox or radio takes a stronger edge than --border;
108
+ a modal dialog dims the page behind it with the scrim. */
109
+ --control-border: light-dark(oklch(0.708 0 0), oklch(0.556 0 0));
110
+ --scrim: light-dark(oklch(0 0 0 / 0.4), oklch(0 0 0 / 0.8));
111
+
112
+ /* ── Surface-relative interactive overlays (work on any elevation) ──
113
+ --overlay is the tint-direction triplet — black for light surfaces,
114
+ white for dark. Components consume it as rgb(var(--overlay) / α), so it
115
+ stays an RGB triplet and switches per theme in base.css. --hover and
116
+ --active are the pre-mixed conveniences. */
117
+ --overlay: 0 0 0;
118
+ --hover: light-dark(rgb(0 0 0 / 0.04), rgb(255 255 255 / 0.06));
119
+ --active: light-dark(rgb(0 0 0 / 0.07), rgb(255 255 255 / 0.1));
120
+
121
+ /* ── Syntax (primitives/code) ──
122
+ Low-chroma hues so code reads as text first; identifiers, JSX text and
123
+ punctuation ride the existing foreground pair. */
124
+ --syntax-keyword: light-dark(oklch(0.52 0.16 300), oklch(0.76 0.12 300));
125
+ --syntax-string: light-dark(oklch(0.52 0.12 150), oklch(0.79 0.11 150));
126
+ --syntax-class: light-dark(oklch(0.56 0.12 65), oklch(0.81 0.1 75));
127
+ --syntax-entity: light-dark(oklch(0.52 0.15 255), oklch(0.77 0.11 250));
128
+ --syntax-property: light-dark(oklch(0.52 0.1 205), oklch(0.79 0.08 200));
129
+ --syntax-comment: light-dark(oklch(0.62 0 0), oklch(0.56 0 0));
130
+ --syntax-identifier: var(--foreground);
131
+ --syntax-jsx: var(--foreground);
132
+ --syntax-sign: var(--muted-foreground);
133
+ }
134
+
135
+ /* ── Badge palette ──
136
+ Badge's `color` hues (upstream hex, as exact oklch). Constant across
137
+ schemes; the solid variant mixes each 15% into --background. */
138
+ :root {
139
+ --badge-gray: oklch(0.715 0 0);
140
+ --badge-red: oklch(0.637 0.208 25.33);
141
+ --badge-orange: oklch(0.7049 0.1867 47.6);
142
+ --badge-amber: oklch(0.7686 0.1647 70.08);
143
+ --badge-yellow: oklch(0.7952 0.1617 86.05);
144
+ --badge-lime: oklch(0.7681 0.2044 130.85);
145
+ --badge-green: oklch(0.723 0.192 149.58);
146
+ --badge-emerald: oklch(0.6959 0.1491 162.48);
147
+ --badge-teal: oklch(0.704 0.123 182.5);
148
+ --badge-cyan: oklch(0.7148 0.1257 215.22);
149
+ --badge-blue: oklch(0.623 0.188 259.81);
150
+ --badge-indigo: oklch(0.585 0.204 277.12);
151
+ --badge-violet: oklch(0.606 0.219 292.72);
152
+ --badge-purple: oklch(0.627 0.233 303.9);
153
+ --badge-fuchsia: oklch(0.667 0.259 322.15);
154
+ --badge-pink: oklch(0.656 0.212 354.31);
155
+ --badge-rose: oklch(0.645 0.215 16.44);
156
+ }
157
+
158
+ /* ── Status roles ──
159
+ The toast states, picked from the badge palette (and --destructive /
160
+ --brand) by reference, so a status reads the same wherever it shows. */
161
+ :root {
162
+ --status-success: var(--badge-green);
163
+ --status-loading: var(--badge-gray);
164
+ --status-error: var(--destructive);
165
+ --status-warning: var(--badge-amber);
166
+ --status-info: var(--badge-blue);
167
+ --status-action: var(--brand);
168
+ }
169
+
170
+ /*
171
+ * Fluid Functionalism motion tokens.
172
+ *
173
+ * Source: mickadesign/fluid-functionalism `registry/default/lib/springs.ts`
174
+ * at commit b3587bdbd83fc66c2a6aae3817ffb856cb09260b — MIT License © 2026
175
+ * Micka Touillaud — fluidfunctionalism.com.
176
+ *
177
+ * FF's motion is JS: the `spring` tiers in lib/springs.ts feed
178
+ * `motion/react`, and components always reach for a tier rather than a
179
+ * hand-written duration. These properties mirror those tiers for CSS
180
+ * consumers and for the tokens page — keep the two in sync.
181
+ *
182
+ * Each tier's enter transition is a spring of the given duration; its exit is
183
+ * a plain tween one step quicker, so a dismissal reads as crisp and final.
184
+ * fast 80ms enter, 60ms exit — critically damped (bounce 0)
185
+ * moderate 160ms enter, 120ms exit — critically damped (bounce 0): panels,
186
+ * dropdowns, tabs, merged selection backgrounds
187
+ * slow 240ms enter, 160ms exit — the one tier with a little bounce
188
+ * (bounce 0.12)
189
+ * The bigger the thing that moves, the slower the tier.
190
+ *
191
+ * Local addition: `goo`, the morph engine's tier for the goo effect — 250ms
192
+ * to land (bounce 0.15), a 200ms spring back — so the liquid neck reads.
193
+ */
194
+
195
+ :root {
196
+ --duration-fast: 80ms;
197
+ --duration-fast-exit: 60ms;
198
+ --duration-moderate: 160ms;
199
+ --duration-moderate-exit: 120ms;
200
+ --duration-slow: 240ms;
201
+ --duration-slow-exit: 160ms;
202
+ --duration-goo: 250ms;
203
+ --duration-goo-exit: 200ms;
204
+ }
205
+
206
+ :root {
207
+ /* Fluid Functionalism's corner token (upstream tokens/radius.css). */
208
+ --radius: 0.625rem;
209
+
210
+ /* Small-box corners between wind4's xs (2px) and md (6px) steps, read by
211
+ the `rounded-box|glyph` utility in preset.ts: checkbox squares and
212
+ keycaps, and the composer's stop glyph. */
213
+ --radius-box: 5px;
214
+ --radius-glyph: 3px;
215
+ }
216
+
217
+ :root {
218
+ /* The docs chrome's spacing rhythm (AGENTS.md generic tokens). */
219
+ --space-1: 4px;
220
+ --space-2: 8px;
221
+ --space-3: 12px;
222
+ --space-4: 16px;
223
+ --space-5: 24px;
224
+ --space-6: 32px;
225
+ }
226
+
227
+ /*
228
+ * Fluid Functionalism type tokens.
229
+ *
230
+ * Source: mickadesign/fluid-functionalism `app/globals.css` §3–4 (`--font-sans`,
231
+ * the `--fs-*` type-scale roles and their `@utility text-*` classes) at commit
232
+ * b3587bdbd83fc66c2a6aae3817ffb856cb09260b — MIT License © 2026 Micka
233
+ * Touillaud — fluidfunctionalism.com.
234
+ *
235
+ * Local changes:
236
+ * - The family is Inter Variable from @fontsource-variable/inter/opsz
237
+ * (imported in base.css) instead of upstream's self-hosted
238
+ * InterVariable.ttf. The opsz build matters: the `--weight-*` ladder sets
239
+ * both the wght and opsz axes.
240
+ * - The role sizes are renamed `--fs-*` → `--text-*` and read by the
241
+ * `text-<role>[-compact]` utility in preset.ts. They hold both columns of
242
+ * `typeScale` in lib/size-context.tsx (keep the two in sync), so a
243
+ * component's `compact ? … : …` picks a token on either side. Upstream's
244
+ * site-chrome extras — the 22px mobile display step and the
245
+ * `html[data-size="compact"]` override set by the docs site's
246
+ * SizeAttribute — are not carried over.
247
+ * - `micro` (keycaps, one notch below caption) is a local role.
248
+ * - Each role's line-height (FF's typography page: 28/34, 16/22, 14/20,
249
+ * 13/20, 12/16) is a `--leading-*` token, emitted by the same
250
+ * `text-<role>` rule; the compact step keeps its role's leading.
251
+ * - The docs chrome's element roles (`--font-size-<el>`, `--line-height-<el>`,
252
+ * `--font-weight-<el>`, `--color-<el>`) reference these, following FF's
253
+ * rules: headings in foreground, text muted.
254
+ * - Upstream's `fontWeights` (lib/font-weight.ts, fontVariationSettings
255
+ * strings) become the `--weight-*` variation settings, read by the
256
+ * `weight-*` utility in preset.ts. Each derives its wght from
257
+ * `--font-weight-*`, the plain font-weight form the docs chrome reads.
258
+ */
259
+
260
+ :root {
261
+ --font-sans: "Inter Variable", ui-sans-serif, system-ui, sans-serif;
262
+ --font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
263
+
264
+ /* Page titles. */
265
+ --text-display: 28px;
266
+ /* Section headings, dialog titles. */
267
+ --text-title: 16px;
268
+ /* Card titles, emphasized rows. */
269
+ --text-subtitle: 14px;
270
+ /* Control labels and body copy. */
271
+ --text-body: 13px;
272
+ /* Secondary text: descriptions, meta rows, errors, group labels. */
273
+ --text-caption: 12px;
274
+ /* Keycaps and chips. */
275
+ --text-micro: 11px;
276
+
277
+ /* Each role's paired line-height. */
278
+ --leading-display: 34px;
279
+ --leading-title: 22px;
280
+ --leading-subtitle: 20px;
281
+ --leading-body: 20px;
282
+ --leading-caption: 16px;
283
+ --leading-micro: 14px;
284
+
285
+ /* The compact step: each role one notch down. */
286
+ --text-display-compact: 24px;
287
+ --text-title-compact: 15px;
288
+ --text-subtitle-compact: 13px;
289
+ --text-body-compact: 12px;
290
+ --text-caption-compact: 11px;
291
+ --text-micro-compact: 10px;
292
+
293
+ /* Inter variable weights, each paired with the opsz that keeps a label's
294
+ advance width steady as it changes weight. */
295
+ --font-weight-normal: 400;
296
+ --font-weight-medium: 450;
297
+ --font-weight-semibold: 550;
298
+ --font-weight-bold: 700;
299
+ --weight-normal: "wght" var(--font-weight-normal), "opsz" 14;
300
+ --weight-medium: "wght" var(--font-weight-medium), "opsz" 15;
301
+ --weight-semibold: "wght" var(--font-weight-semibold), "opsz" 18;
302
+ --weight-bold: "wght" var(--font-weight-bold), "opsz" 25;
303
+
304
+ /* The docs chrome's elements (modo's type contract), on the roles above. */
305
+ --font-size-h1: var(--text-display);
306
+ --line-height-h1: var(--leading-display);
307
+ --font-weight-h1: var(--font-weight-bold);
308
+ --color-h1: var(--foreground);
309
+
310
+ --font-size-h2: var(--text-title);
311
+ --line-height-h2: var(--leading-title);
312
+ --font-weight-h2: var(--font-weight-semibold);
313
+ --color-h2: var(--foreground);
314
+
315
+ --font-size-h3: var(--text-subtitle);
316
+ --line-height-h3: var(--leading-subtitle);
317
+ --font-weight-h3: var(--font-weight-semibold);
318
+ --color-h3: var(--foreground);
319
+
320
+ --font-size-h4: var(--text-body);
321
+ --line-height-h4: var(--leading-body);
322
+ --font-weight-h4: var(--font-weight-semibold);
323
+ --color-h4: var(--foreground);
324
+
325
+ --font-size-p: var(--text-body);
326
+ --line-height-p: var(--leading-body);
327
+ --font-weight-p: var(--font-weight-normal);
328
+ --color-p: var(--muted-foreground);
329
+
330
+ --font-size-lead: var(--text-body);
331
+ --line-height-lead: var(--leading-body);
332
+ --font-weight-lead: var(--font-weight-normal);
333
+ --color-lead: var(--muted-foreground);
334
+
335
+ --font-size-eyebrow: var(--text-caption);
336
+ --line-height-eyebrow: var(--leading-caption);
337
+ --font-weight-eyebrow: var(--font-weight-medium);
338
+ --color-eyebrow: var(--muted-foreground);
339
+
340
+ --font-size-sm: var(--text-caption);
341
+ --line-height-sm: var(--leading-caption);
342
+
343
+ --font-size-xs: var(--text-micro);
344
+ --line-height-xs: var(--leading-micro);
345
+ }
package/package.json CHANGED
@@ -1,6 +1,105 @@
1
1
  {
2
2
  "name": "@justanarthur/modo-ui",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "type": "module",
4
+ "version": "0.2.0",
5
+ "description": "Fluid Functionalism (Base UI flavor, MIT © 2026 Micka Touillaud) ported to UnoCSS: motion springs, fluid hover, a two-step size ladder and an eight-level elevated surface system. Documented with modo.",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "design-system",
9
+ "react",
10
+ "components",
11
+ "base-ui",
12
+ "unocss",
13
+ "tailwindcss",
14
+ "motion",
15
+ "fluid-functionalism"
16
+ ],
17
+ "homepage": "https://github.com/justAnArthur/modo/tree/main/ui#readme",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/justAnArthur/modo.git",
21
+ "directory": "ui"
22
+ },
23
+ "bugs": {
24
+ "url": "https://github.com/justAnArthur/modo/issues"
25
+ },
26
+ "author": {
27
+ "name": "justAnArthur",
28
+ "email": "kozubov.arthur@gmail.com"
29
+ },
30
+ "properties": {
31
+ "gitCommitScopeRelatedNames": "ui,modo-ui,@justanarthur/modo-ui,justanarthur/modo-ui"
32
+ },
33
+ "publishConfig": {
34
+ "registry": "https://registry.npmjs.org/",
35
+ "access": "public"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "README.md",
40
+ "LICENSE*"
41
+ ],
42
+ "module": "./dist/index.js",
43
+ "types": "./dist/index.d.ts",
44
+ "exports": {
45
+ ".": {
46
+ "types": "./dist/index.d.ts",
47
+ "default": "./dist/index.js"
48
+ },
49
+ "./primitives/*": {
50
+ "types": "./dist/primitives/*/index.d.ts",
51
+ "default": "./dist/primitives/*/index.js"
52
+ },
53
+ "./components/*": {
54
+ "types": "./dist/components/*/index.d.ts",
55
+ "default": "./dist/components/*/index.js"
56
+ },
57
+ "./blocks/*": {
58
+ "types": "./dist/blocks/*/index.d.ts",
59
+ "default": "./dist/blocks/*/index.js"
60
+ },
61
+ "./unocss": {
62
+ "types": "./dist/preset.d.ts",
63
+ "default": "./dist/preset.js"
64
+ },
65
+ "./styles.css": "./dist/styles.css",
66
+ "./base.css": "./dist/base.css",
67
+ "./tokens.css": "./dist/tokens.css",
68
+ "./tailwind.css": "./dist/tailwind.css",
69
+ "./package.json": "./package.json"
70
+ },
71
+ "scripts": {
72
+ "build": "rm -rf dist && NODE_ENV=production bunup && bun scripts/build-css.ts",
73
+ "build:docs": "modo build --out docs-dist",
74
+ "dev": "modo dev",
75
+ "check": "tsc --noEmit"
76
+ },
77
+ "dependencies": {
78
+ "@base-ui/react": "1.4.1",
79
+ "@fontsource-variable/inter": "^5.3.0",
80
+ "class-variance-authority": "^0.7.1",
81
+ "cn": "^0.3.0",
82
+ "date-fns": "^4.4.0",
83
+ "lucide-react": "^1.47.0",
84
+ "motion": "^13.4.0",
85
+ "pdfjs-dist": "^5.7.284",
86
+ "react-day-picker": "^10.0.2",
87
+ "sugar-high": "^2.5.1"
88
+ },
89
+ "peerDependencies": {
90
+ "react": ">=18",
91
+ "react-dom": ">=18"
92
+ },
93
+ "devDependencies": {
94
+ "@justanarthur/modo": "0.8.0",
95
+ "@types/react": "^18.3.0",
96
+ "@types/react-dom": "^18.3.0",
97
+ "bunup": "^0.16.0",
98
+ "esbuild": "^0.20.0",
99
+ "react": "^18.3.0",
100
+ "react-dom": "^18.3.0",
101
+ "typescript": "^5.4.0",
102
+ "unocss": "66.10.5",
103
+ "vite": "^5.4.0"
104
+ }
105
+ }