@getdom/studio 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -8,13 +8,34 @@ DOM Studio is a Vue 3 and Web Component interface system for application UI.
8
8
  npm install @getdom/studio
9
9
  ```
10
10
 
11
- Import the maintained Vue components and the Tailwind CSS v4 stylesheet:
11
+ For the quickest start, import the maintained Vue components and the complete
12
+ Tailwind CSS v4 stylesheet:
12
13
 
13
14
  ```js
14
15
  import { DomButton, DomCard, DomForm } from '@getdom/studio';
15
16
  import '@getdom/studio/style.css';
16
17
  ```
17
18
 
19
+ For a production app, let your own stylesheet run Tailwind and own the theme:
20
+
21
+ ```css
22
+ @import "tailwindcss";
23
+ @import "@getdom/studio/tailwind.css";
24
+
25
+ :root {
26
+ --canvas: #fff;
27
+ --canvas-fg: oklch(0.145 0 0);
28
+ --primary: oklch(0.205 0 0);
29
+ --primary-fg: oklch(0.985 0 0);
30
+ /* Add the remaining semantic theme values for your app. */
31
+ }
32
+ ```
33
+
34
+ `tailwind.css` supplies DOM Studio's Tailwind sources, semantic utility mapping,
35
+ and intrinsic component styles without choosing the theme values. Copy
36
+ `theme.css` into your project when you want all of DOM Studio's defaults as a
37
+ starting point, then edit that local copy.
38
+
18
39
  The explicit Vue entry point exports the same component surface:
19
40
 
20
41
  ```js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getdom/studio",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "A Vue 3 and Web Component interface system for application UI.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE.md",
@@ -40,6 +40,8 @@
40
40
  "import": "./src/pages/lib/headless/*.js"
41
41
  },
42
42
  "./style.css": "./src/style.css",
43
+ "./tailwind.css": "./src/tailwind.css",
44
+ "./theme.css": "./src/theme.css",
43
45
  "./llms.txt": "./public/llms.txt",
44
46
  "./skill": "./SKILL.md",
45
47
  "./skills.sh": "./public/skills.sh",
package/src/style.css CHANGED
@@ -1,446 +1,3 @@
1
1
  @import "tailwindcss";
2
- @source "./pages/**/*.{vue,js}";
3
- @source inline("transition duration-1000 ease-in ease-out opacity-0 opacity-100 scale-50 scale-100");
4
- @custom-variant dark (&:where([data-theme='dark'], [data-theme='dark'] *));
5
-
6
- :root,
7
- [data-theme="light"] {
8
- color-scheme: light;
9
- --radius: 0.625rem;
10
- --radius-sm: calc(var(--radius) * 0.6);
11
- --radius-md: calc(var(--radius) * 0.8);
12
- --radius-lg: var(--radius);
13
- --radius-xl: calc(var(--radius) * 1.4);
14
- --radius-2xl: calc(var(--radius) * 1.8);
15
- --radius-3xl: calc(var(--radius) * 2.2);
16
- --radius-4xl: calc(var(--radius) * 2.6);
17
- --shadow-xs: 0 1px 1px 0 rgb(15 23 42 / 0.04);
18
- --shadow-sm: 0 1px 2px 0 rgb(15 23 42 / 0.06);
19
- --shadow-md: 0 3px 8px -2px rgb(15 23 42 / 0.12), 0 1px 2px -1px rgb(15 23 42 / 0.08);
20
- --shadow-lg: 0 8px 20px -6px rgb(15 23 42 / 0.16), 0 2px 6px -2px rgb(15 23 42 / 0.08);
21
- --shadow-xl: 0 18px 44px -18px rgb(15 23 42 / 0.24), 0 8px 18px -12px rgb(15 23 42 / 0.16);
22
- --shadow-2xl: 0 24px 60px -18px rgb(15 23 42 / 0.24), 0 8px 20px -10px rgb(15 23 42 / 0.14);
23
- --canvas: #fff;
24
- --canvas-fg: oklch(0.145 0 0);
25
- --primary: oklch(0.205 0 0);
26
- --primary-fg: oklch(0.985 0 0);
27
- --secondary: oklch(0.97 0 0);
28
- --secondary-fg: oklch(0.205 0 0);
29
- --muted: oklch(0.97 0 0);
30
- --muted-fg: oklch(0.50 0 0);
31
- --accent: oklch(0.97 0 0);
32
- --accent-fg: oklch(0.205 0 0);
33
- --destructive: oklch(0.577 0.245 27.325);
34
- --destructive-fg: oklch(0.985 0 0);
35
- --success: oklch(0.57 0.794 149.350);
36
- --success-fg: oklch(0.985 0 0);
37
- --warning: oklch(0.7 0.2 84);
38
- --warning-fg: oklch(0.28 0.07 46);
39
- --border: oklch(0.922 0 0);
40
- --input: oklch(0.922 0 0);
41
- --ring: oklch(0.708 0 0);
42
- }
43
-
44
- /*
45
- * The month calendar always responds to its own container. Tailwind expands
46
- * theme(...) while compiling the combined app stylesheet, so consumer @theme
47
- * overrides remain the single source of truth for its sensible defaults.
48
- */
49
- .dom-month-calendar__grid {
50
- --dom-month-calendar-day-min-height: 7.5rem;
51
- --dom-month-calendar-day-headers-display: none;
52
- --dom-month-calendar-row-rail-align: center;
53
- --dom-month-calendar-row-rail-direction: row;
54
- --dom-month-calendar-row-rail-justify: space-between;
55
- --dom-month-calendar-row-rail-min-height: 2.5rem;
56
- --dom-month-calendar-week-columns: minmax(0, 1fr);
57
- }
58
-
59
- .dom-month-calendar__continuous-mobile-header {
60
- display: flex;
61
- }
62
-
63
- @container (min-width: theme(--breakpoint-lg)) {
64
- .dom-month-calendar__continuous-mobile-header {
65
- display: none;
66
- }
67
-
68
- .dom-month-calendar__grid {
69
- --dom-month-calendar-day-min-height: 11rem;
70
- --dom-month-calendar-day-headers-display: grid;
71
- --dom-month-calendar-row-rail-align: flex-start;
72
- --dom-month-calendar-row-rail-direction: column;
73
- --dom-month-calendar-row-rail-justify: flex-start;
74
- --dom-month-calendar-row-rail-min-height: 11rem;
75
- --dom-month-calendar-week-columns: var(--dom-month-calendar-wide-week-columns);
76
- --dom-month-calendar-wide-border-left-width: 1px;
77
- --dom-month-calendar-wide-border-top-width: 0;
78
- --dom-month-calendar-wide-boundary-gradient: linear-gradient(var(--dom-month-calendar-boundary-color), var(--dom-month-calendar-boundary-color));
79
- --dom-month-calendar-wide-boundary-left-size: 2px 100%;
80
- --dom-month-calendar-wide-boundary-top-size: 100% 2px;
81
- }
82
- }
83
-
84
- [data-theme="dark"] {
85
- color-scheme: dark;
86
- --shadow-xs: 0 1px 1px 0 rgb(0 0 0 / 0.28);
87
- --shadow-sm: 0 1px 0 0 rgb(255 255 255 / 0.04) inset, 0 1px 2px 0 rgb(0 0 0 / 0.34);
88
- --shadow-md: 0 1px 0 0 rgb(255 255 255 / 0.04) inset, 0 8px 18px -10px rgb(0 0 0 / 0.52), 0 2px 5px -3px rgb(0 0 0 / 0.44);
89
- --shadow-lg: 0 1px 0 0 rgb(255 255 255 / 0.05) inset, 0 16px 34px -18px rgb(0 0 0 / 0.58), 0 5px 12px -8px rgb(0 0 0 / 0.5);
90
- --shadow-xl: 0 1px 0 0 rgb(255 255 255 / 0.05) inset, 0 24px 52px -24px rgb(0 0 0 / 0.68), 0 10px 22px -14px rgb(0 0 0 / 0.56);
91
- --shadow-2xl: 0 1px 0 0 rgb(255 255 255 / 0.06) inset, 0 34px 76px -30px rgb(0 0 0 / 0.72), 0 16px 34px -20px rgb(0 0 0 / 0.58);
92
- --canvas: oklch(0.145 0 0);
93
- --canvas-fg: oklch(0.985 0 0);
94
- --primary: oklch(0.922 0 0);
95
- --primary-fg: oklch(0.205 0 0);
96
- --secondary: oklch(0.269 0 0);
97
- --secondary-fg: oklch(0.985 0 0);
98
- --muted: oklch(0.269 0 0);
99
- --muted-fg: oklch(0.708 0 0);
100
- --accent: oklch(0.269 0 0);
101
- --accent-fg: oklch(0.985 0 0);
102
- --destructive: oklch(0.704 0.191 22.216);
103
- --destructive-fg: oklch(0.985 0 0);
104
- --success: oklch(0.696 0.17 162.48);
105
- --success-fg: oklch(0.145 0 0);
106
- --warning: oklch(0.769 0.188 70.08);
107
- --warning-fg: oklch(0.145 0 0);
108
- --border: oklch(1 0 0 / 10%);
109
- --input: oklch(1 0 0 / 15%);
110
- --ring: oklch(0.556 0 0);
111
- }
112
-
113
- @theme inline {
114
- --color-canvas: var(--canvas);
115
- --color-canvas-fg: var(--canvas-fg);
116
- --color-primary: var(--primary);
117
- --color-primary-fg: var(--primary-fg);
118
- --color-secondary: var(--secondary);
119
- --color-secondary-fg: var(--secondary-fg);
120
- --color-muted: var(--muted);
121
- --color-muted-fg: var(--muted-fg);
122
- --color-accent: var(--accent);
123
- --color-accent-fg: var(--accent-fg);
124
- --color-destructive: var(--destructive);
125
- --color-destructive-fg: var(--destructive-fg);
126
- --color-success: var(--success);
127
- --color-success-fg: var(--success-fg);
128
- --color-warning: var(--warning);
129
- --color-warning-fg: var(--warning-fg);
130
- --color-border: var(--border);
131
- --color-input: var(--input);
132
- --color-ring: var(--ring);
133
- --radius-sm: calc(var(--radius) * 0.6);
134
- --radius-md: calc(var(--radius) * 0.8);
135
- --radius-lg: var(--radius);
136
- --radius-xl: calc(var(--radius) * 1.4);
137
- --radius-2xl: calc(var(--radius) * 1.8);
138
- --radius-3xl: calc(var(--radius) * 2.2);
139
- --radius-4xl: calc(var(--radius) * 2.6);
140
- }
141
-
142
- * {
143
- box-sizing: border-box;
144
- }
145
-
146
- html,
147
- body,
148
- #app {
149
- min-height: 100%;
150
- }
151
-
152
- body {
153
- margin: 0;
154
- font-family:
155
- "Plus Jakarta Sans Variable",
156
- "Plus Jakarta Sans",
157
- ui-sans-serif,
158
- system-ui,
159
- -apple-system,
160
- BlinkMacSystemFont,
161
- "Segoe UI",
162
- sans-serif;
163
- background: var(--canvas);
164
- color: var(--canvas-fg);
165
- text-rendering: optimizeLegibility;
166
- -webkit-font-smoothing: antialiased;
167
- }
168
-
169
- @layer utilities {
170
- .skin-card {
171
- background-color: var(--skin-card-bg, var(--canvas));
172
- background-image: var(--skin-card-bg-image, none);
173
- border-color: var(--skin-card-border, var(--border));
174
- border-style: var(--skin-card-border-style, solid);
175
- border-width: var(--skin-card-border-width, 1px);
176
- box-shadow: var(--skin-card-shadow, var(--shadow-xs));
177
- color: var(--skin-card-fg, var(--canvas-fg));
178
- backdrop-filter: var(--skin-card-backdrop, none);
179
- -webkit-backdrop-filter: var(--skin-card-backdrop, none);
180
- }
181
-
182
- .skin-popover {
183
- background-color: var(--skin-popover-bg, var(--canvas));
184
- background-image: var(--skin-popover-bg-image, none);
185
- border-color: var(--skin-popover-border, var(--border));
186
- border-style: var(--skin-popover-border-style, solid);
187
- border-width: var(--skin-popover-border-width, 1px);
188
- box-shadow: var(--skin-popover-shadow, var(--shadow-lg));
189
- color: var(--skin-popover-fg, var(--canvas-fg));
190
- backdrop-filter: var(--skin-popover-backdrop, none);
191
- -webkit-backdrop-filter: var(--skin-popover-backdrop, none);
192
- }
193
-
194
- .skin-overlay {
195
- background-color: var(--skin-overlay-bg, var(--canvas));
196
- background-image: var(--skin-overlay-bg-image, none);
197
- border-color: var(--skin-overlay-border, var(--border));
198
- border-style: var(--skin-overlay-border-style, solid);
199
- border-width: var(--skin-overlay-border-width, 1px);
200
- box-shadow: var(--skin-overlay-shadow, var(--shadow-2xl));
201
- color: var(--skin-overlay-fg, var(--canvas-fg));
202
- backdrop-filter: var(--skin-overlay-backdrop, blur(20px) saturate(1.12));
203
- -webkit-backdrop-filter: var(--skin-overlay-backdrop, blur(20px) saturate(1.12));
204
- }
205
-
206
- .skin-control {
207
- background-color: var(--skin-control-bg, var(--secondary));
208
- background-image: var(--skin-control-bg-image, none);
209
- border-color: var(--skin-control-border, var(--border));
210
- border-style: var(--skin-control-border-style, solid);
211
- border-width: var(--skin-control-border-width, 1px);
212
- box-shadow: var(--skin-control-shadow, var(--shadow-xs));
213
- color: var(--skin-control-fg, var(--secondary-fg));
214
- backdrop-filter: var(--skin-control-backdrop, none);
215
- -webkit-backdrop-filter: var(--skin-control-backdrop, none);
216
- }
217
-
218
- .skin-action {
219
- background-color: var(--skin-action-bg, var(--primary));
220
- background-image: var(--skin-action-bg-image, linear-gradient(to bottom, color-mix(in oklch, white 10%, transparent), transparent));
221
- border-color: var(--skin-action-border, color-mix(in oklch, var(--primary) 80%, var(--border)));
222
- border-style: var(--skin-action-border-style, solid);
223
- border-width: var(--skin-action-border-width, 1px);
224
- box-shadow: var(--skin-action-shadow, var(--shadow-sm));
225
- color: var(--skin-action-fg, var(--primary-fg));
226
- backdrop-filter: var(--skin-action-backdrop, none);
227
- -webkit-backdrop-filter: var(--skin-action-backdrop, none);
228
- }
229
- }
230
-
231
- /* DOM Studio custom-elements: hide pre-upgrade light-DOM children so SSR'd
232
- * dialog / popover content doesn't render in flow before the JS module
233
- * loads and the shadow DOM takes over. Trigger slots stay visible. */
234
- dom-dialog:not(:defined) > *:not([slot="trigger"]),
235
- dom-popover:not(:defined) > *:not([slot="trigger"]) {
236
- display: none;
237
- }
238
-
239
- /* Shiki code blocks. Shiki emits dual-theme styles in one render — the inline
240
- * styles carry the light colours and the dark colours as CSS variables.
241
- * Override those vars when [data-theme="dark"] is on the root. */
242
- .dom-shiki {
243
- min-width: 0;
244
- max-width: 100%;
245
- overflow-x: auto;
246
- }
247
- .dom-shiki .shiki {
248
- box-sizing: border-box;
249
- margin: 0;
250
- min-width: 0;
251
- max-width: 100%;
252
- overflow-x: auto;
253
- padding: 1rem;
254
- font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
255
- font-size: 12.5px;
256
- line-height: 1.65;
257
- }
258
- .dom-shiki .shiki,
259
- .dom-shiki .shiki code {
260
- background-color: inherit;
261
- }
262
- [data-theme="dark"] .dom-shiki .shiki:not([data-theme="light"] *),
263
- [data-theme="dark"] .dom-shiki .shiki span:not([data-theme="light"] *),
264
- .dom-code[data-theme="dark"] > .dom-shiki .shiki,
265
- .dom-code[data-theme="dark"] > .dom-shiki .shiki span {
266
- color: var(--shiki-dark) !important;
267
- background-color: var(--shiki-dark-bg) !important;
268
- }
269
- [data-theme="dark"] .dom-shiki .shiki span:not([data-theme="light"] *),
270
- .dom-code[data-theme="dark"] > .dom-shiki .shiki span {
271
- font-style: var(--shiki-dark-font-style) !important;
272
- font-weight: var(--shiki-dark-font-weight) !important;
273
- text-decoration: var(--shiki-dark-text-decoration) !important;
274
- }
275
- [data-theme="dark"] .dom-code-token:not([data-theme="light"] *) {
276
- background-color: var(--shiki-dark-bg) !important;
277
- color: var(--shiki-dark) !important;
278
- font-style: var(--shiki-dark-font-style) !important;
279
- font-weight: var(--shiki-dark-font-weight) !important;
280
- text-decoration: var(--shiki-dark-text-decoration) !important;
281
- }
282
-
283
- @layer components {
284
- .skin-input {
285
- background-color: var(--skin-input-bg, var(--canvas));
286
- background-image: var(--skin-input-bg-image, none);
287
- border-color: var(--skin-input-border, var(--input));
288
- border-style: var(--skin-input-border-style, solid);
289
- border-width: var(--skin-input-border-width, 1px);
290
- box-shadow: var(--skin-input-shadow, inset 0 1px 2px rgb(15 23 42 / 0.1));
291
- color: var(--skin-input-fg, var(--canvas-fg));
292
- backdrop-filter: var(--skin-input-backdrop, none);
293
- -webkit-backdrop-filter: var(--skin-input-backdrop, none);
294
- @apply w-full rounded-lg px-3 py-2 text-sm outline-none transition placeholder:text-muted-fg focus:border-ring focus:ring-2 focus:ring-ring/30 disabled:opacity-50;
295
- }
296
-
297
- dom-dropdown[open] > [slot="trigger"].skin-input,
298
- dom-dropdown[open] > [data-trigger].skin-input {
299
- @apply border-ring ring-2 ring-ring/30;
300
- }
301
-
302
- .dom-floating-transition {
303
- --dom-floating-enter-x: 0px;
304
- --dom-floating-enter-y: -10px;
305
- --dom-floating-origin: top center;
306
- --dom-floating-scale: 0.975;
307
- --dom-floating-enter-opacity-duration: 190ms;
308
- --dom-floating-enter-transform-duration: 260ms;
309
- --dom-floating-leave-opacity-duration: 190ms;
310
- --dom-floating-leave-transform-duration: 260ms;
311
- --dom-floating-enter-easing: cubic-bezier(0.16, 1, 0.3, 1);
312
- --dom-floating-leave-easing: cubic-bezier(0.25, 0.1, 0.25, 1);
313
- --dom-popover-arrow-x: 50%;
314
- --dom-popover-arrow-y: auto;
315
- opacity: 0;
316
- transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale));
317
- transform-origin: var(--dom-floating-origin);
318
- transition:
319
- opacity var(--dom-floating-enter-opacity-duration) var(--dom-floating-enter-easing),
320
- transform var(--dom-floating-enter-transform-duration) var(--dom-floating-enter-easing);
321
- will-change: opacity, transform;
322
- animation: none;
323
- }
324
-
325
- @keyframes dom-floating-scale-fade-opacity-in {
326
- from { opacity: 0; }
327
- to { opacity: 1; }
328
- }
329
-
330
- @keyframes dom-floating-scale-fade-opacity-out {
331
- from { opacity: 1; }
332
- to { opacity: 0; }
333
- }
334
-
335
- @keyframes dom-floating-scale-fade-transform-in {
336
- from { transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale)); }
337
- to { transform: translate3d(0, 0, 0) scale(1); }
338
- }
339
-
340
- @keyframes dom-floating-scale-fade-transform-out {
341
- from { transform: translate3d(0, 0, 0) scale(1); }
342
- to { transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale)); }
343
- }
344
-
345
- .dom-floating-transition:popover-open,
346
- .dom-floating-transition[data-floating-open="true"] {
347
- opacity: 1;
348
- transform: translate3d(0, 0, 0) scale(1);
349
- }
350
-
351
- .dom-floating-transition[data-entering="from"]:popover-open,
352
- .dom-floating-transition[data-entering="from"][data-floating-open="true"],
353
- .dom-floating-transition[data-leaving="to"]:popover-open,
354
- .dom-floating-transition[data-leaving="to"][data-floating-open="true"] {
355
- opacity: 0;
356
- transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale));
357
- }
358
-
359
- .dom-floating-transition[data-entering="to"]:popover-open,
360
- .dom-floating-transition[data-entering="to"][data-floating-open="true"],
361
- .dom-floating-transition[data-leaving="from"]:popover-open,
362
- .dom-floating-transition[data-leaving="from"][data-floating-open="true"] {
363
- opacity: 1;
364
- transform: translate3d(0, 0, 0) scale(1);
365
- }
366
-
367
- .dom-floating-transition[data-floating-effect="scale-fade"][data-entering="to"]:popover-open,
368
- .dom-floating-transition[data-floating-effect="scale-fade"][data-entering="to"][data-floating-open="true"] {
369
- animation:
370
- dom-floating-scale-fade-opacity-in var(--dom-floating-enter-opacity-duration) var(--dom-floating-enter-easing) both,
371
- dom-floating-scale-fade-transform-in var(--dom-floating-enter-transform-duration) var(--dom-floating-enter-easing) both;
372
- }
373
-
374
- .dom-floating-transition[data-leaving="to"]:popover-open {
375
- transition:
376
- opacity var(--dom-floating-leave-opacity-duration) linear,
377
- transform var(--dom-floating-leave-transform-duration) var(--dom-floating-leave-easing);
378
- }
379
-
380
- .dom-floating-transition[data-leaving="to"][data-floating-open="true"] {
381
- transition:
382
- opacity var(--dom-floating-leave-opacity-duration) linear,
383
- transform var(--dom-floating-leave-transform-duration) var(--dom-floating-leave-easing);
384
- }
385
-
386
- .dom-floating-transition[data-floating-effect="scale-fade"][data-leaving="to"]:popover-open,
387
- .dom-floating-transition[data-floating-effect="scale-fade"][data-leaving="to"][data-floating-open="true"] {
388
- transition: none;
389
- animation:
390
- dom-floating-scale-fade-opacity-out var(--dom-floating-leave-opacity-duration) linear both,
391
- dom-floating-scale-fade-transform-out var(--dom-floating-leave-transform-duration) var(--dom-floating-leave-easing) both;
392
- }
393
-
394
- @starting-style {
395
- .dom-floating-transition:popover-open {
396
- opacity: 0;
397
- transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale));
398
- }
399
- }
400
-
401
- .dom-floating-transition:not([data-animate-placement]) {
402
- transition-property: opacity;
403
- }
404
-
405
- .dom-floating-transition[data-side="top"] {
406
- --dom-floating-enter-y: 10px;
407
- --dom-floating-origin: bottom center;
408
- }
409
-
410
- .dom-floating-transition[data-side="bottom"] {
411
- --dom-floating-enter-y: -10px;
412
- --dom-floating-origin: top center;
413
- }
414
-
415
- .dom-floating-transition[data-side="left"] {
416
- --dom-floating-enter-x: 10px;
417
- --dom-floating-enter-y: 0px;
418
- --dom-floating-origin: center right;
419
- }
420
-
421
- .dom-floating-transition[data-side="right"] {
422
- --dom-floating-enter-x: -10px;
423
- --dom-floating-enter-y: 0px;
424
- --dom-floating-origin: center left;
425
- }
426
-
427
- .dom-floating-transition[data-floating-effect="fade"] {
428
- --dom-floating-enter-x: 0px;
429
- --dom-floating-enter-y: 0px;
430
- --dom-floating-scale: 1;
431
- --dom-floating-enter-transform-duration: 0ms;
432
- --dom-floating-leave-transform-duration: 0ms;
433
- }
434
-
435
- [data-invalid] .skin-input,
436
- .skin-input[data-invalid] {
437
- @apply border-destructive focus:border-destructive focus:ring-destructive/25;
438
- }
439
-
440
- [data-invalid] dom-dropdown[open] > [slot="trigger"].skin-input,
441
- [data-invalid] dom-dropdown[open] > [data-trigger].skin-input,
442
- dom-dropdown[open] > [slot="trigger"].skin-input[aria-invalid="true"],
443
- dom-dropdown[open] > [data-trigger].skin-input[aria-invalid="true"] {
444
- @apply border-destructive ring-2 ring-destructive/25;
445
- }
446
- }
2
+ @import "./tailwind.css";
3
+ @import "./theme.css";
@@ -0,0 +1,351 @@
1
+ @source "./pages/**/*.{vue,js}";
2
+ @source inline("transition duration-1000 ease-in ease-out opacity-0 opacity-100 scale-50 scale-100");
3
+ @custom-variant dark (&:where([data-theme='dark'], [data-theme='dark'] *));
4
+
5
+ /*
6
+ * The month calendar always responds to its own container. Tailwind expands
7
+ * theme(...) while compiling the combined app stylesheet, so consumer @theme
8
+ * overrides remain the single source of truth for its sensible defaults.
9
+ */
10
+ .dom-month-calendar__grid {
11
+ --dom-month-calendar-day-min-height: 7.5rem;
12
+ --dom-month-calendar-day-headers-display: none;
13
+ --dom-month-calendar-row-rail-align: center;
14
+ --dom-month-calendar-row-rail-direction: row;
15
+ --dom-month-calendar-row-rail-justify: space-between;
16
+ --dom-month-calendar-row-rail-min-height: 2.5rem;
17
+ --dom-month-calendar-week-columns: minmax(0, 1fr);
18
+ }
19
+
20
+ .dom-month-calendar__continuous-mobile-header {
21
+ display: flex;
22
+ }
23
+
24
+ @container (min-width: theme(--breakpoint-lg)) {
25
+ .dom-month-calendar__continuous-mobile-header {
26
+ display: none;
27
+ }
28
+
29
+ .dom-month-calendar__grid {
30
+ --dom-month-calendar-day-min-height: 11rem;
31
+ --dom-month-calendar-day-headers-display: grid;
32
+ --dom-month-calendar-row-rail-align: flex-start;
33
+ --dom-month-calendar-row-rail-direction: column;
34
+ --dom-month-calendar-row-rail-justify: flex-start;
35
+ --dom-month-calendar-row-rail-min-height: 11rem;
36
+ --dom-month-calendar-week-columns: var(--dom-month-calendar-wide-week-columns);
37
+ --dom-month-calendar-wide-border-left-width: 1px;
38
+ --dom-month-calendar-wide-border-top-width: 0;
39
+ --dom-month-calendar-wide-boundary-gradient: linear-gradient(var(--dom-month-calendar-boundary-color), var(--dom-month-calendar-boundary-color));
40
+ --dom-month-calendar-wide-boundary-left-size: 2px 100%;
41
+ --dom-month-calendar-wide-boundary-top-size: 100% 2px;
42
+ }
43
+ }
44
+
45
+ @theme inline {
46
+ --color-canvas: var(--canvas);
47
+ --color-canvas-fg: var(--canvas-fg);
48
+ --color-primary: var(--primary);
49
+ --color-primary-fg: var(--primary-fg);
50
+ --color-secondary: var(--secondary);
51
+ --color-secondary-fg: var(--secondary-fg);
52
+ --color-muted: var(--muted);
53
+ --color-muted-fg: var(--muted-fg);
54
+ --color-accent: var(--accent);
55
+ --color-accent-fg: var(--accent-fg);
56
+ --color-destructive: var(--destructive);
57
+ --color-destructive-fg: var(--destructive-fg);
58
+ --color-success: var(--success);
59
+ --color-success-fg: var(--success-fg);
60
+ --color-warning: var(--warning);
61
+ --color-warning-fg: var(--warning-fg);
62
+ --color-border: var(--border);
63
+ --color-input: var(--input);
64
+ --color-ring: var(--ring);
65
+ --radius-sm: calc(var(--radius) * 0.6);
66
+ --radius-md: calc(var(--radius) * 0.8);
67
+ --radius-lg: var(--radius);
68
+ --radius-xl: calc(var(--radius) * 1.4);
69
+ --radius-2xl: calc(var(--radius) * 1.8);
70
+ --radius-3xl: calc(var(--radius) * 2.2);
71
+ --radius-4xl: calc(var(--radius) * 2.6);
72
+ }
73
+
74
+ @layer utilities {
75
+ .skin-card {
76
+ background-color: var(--skin-card-bg, var(--canvas));
77
+ background-image: var(--skin-card-bg-image, none);
78
+ border-color: var(--skin-card-border, var(--border));
79
+ border-style: var(--skin-card-border-style, solid);
80
+ border-width: var(--skin-card-border-width, 1px);
81
+ box-shadow: var(--skin-card-shadow, var(--shadow-xs));
82
+ color: var(--skin-card-fg, var(--canvas-fg));
83
+ backdrop-filter: var(--skin-card-backdrop, none);
84
+ -webkit-backdrop-filter: var(--skin-card-backdrop, none);
85
+ }
86
+
87
+ .skin-popover {
88
+ background-color: var(--skin-popover-bg, var(--canvas));
89
+ background-image: var(--skin-popover-bg-image, none);
90
+ border-color: var(--skin-popover-border, var(--border));
91
+ border-style: var(--skin-popover-border-style, solid);
92
+ border-width: var(--skin-popover-border-width, 1px);
93
+ box-shadow: var(--skin-popover-shadow, var(--shadow-lg));
94
+ color: var(--skin-popover-fg, var(--canvas-fg));
95
+ backdrop-filter: var(--skin-popover-backdrop, none);
96
+ -webkit-backdrop-filter: var(--skin-popover-backdrop, none);
97
+ }
98
+
99
+ .skin-overlay {
100
+ background-color: var(--skin-overlay-bg, var(--canvas));
101
+ background-image: var(--skin-overlay-bg-image, none);
102
+ border-color: var(--skin-overlay-border, var(--border));
103
+ border-style: var(--skin-overlay-border-style, solid);
104
+ border-width: var(--skin-overlay-border-width, 1px);
105
+ box-shadow: var(--skin-overlay-shadow, var(--shadow-2xl));
106
+ color: var(--skin-overlay-fg, var(--canvas-fg));
107
+ backdrop-filter: var(--skin-overlay-backdrop, blur(20px) saturate(1.12));
108
+ -webkit-backdrop-filter: var(--skin-overlay-backdrop, blur(20px) saturate(1.12));
109
+ }
110
+
111
+ .skin-control {
112
+ background-color: var(--skin-control-bg, var(--secondary));
113
+ background-image: var(--skin-control-bg-image, none);
114
+ border-color: var(--skin-control-border, var(--border));
115
+ border-style: var(--skin-control-border-style, solid);
116
+ border-width: var(--skin-control-border-width, 1px);
117
+ box-shadow: var(--skin-control-shadow, var(--shadow-xs));
118
+ color: var(--skin-control-fg, var(--secondary-fg));
119
+ backdrop-filter: var(--skin-control-backdrop, none);
120
+ -webkit-backdrop-filter: var(--skin-control-backdrop, none);
121
+ }
122
+
123
+ .skin-action {
124
+ background-color: var(--skin-action-bg, var(--primary));
125
+ background-image: var(--skin-action-bg-image, linear-gradient(to bottom, color-mix(in oklch, white 10%, transparent), transparent));
126
+ border-color: var(--skin-action-border, color-mix(in oklch, var(--primary) 80%, var(--border)));
127
+ border-style: var(--skin-action-border-style, solid);
128
+ border-width: var(--skin-action-border-width, 1px);
129
+ box-shadow: var(--skin-action-shadow, var(--shadow-sm));
130
+ color: var(--skin-action-fg, var(--primary-fg));
131
+ backdrop-filter: var(--skin-action-backdrop, none);
132
+ -webkit-backdrop-filter: var(--skin-action-backdrop, none);
133
+ }
134
+ }
135
+
136
+ /* DOM Studio custom-elements: hide pre-upgrade light-DOM children so SSR'd
137
+ * dialog / popover content doesn't render in flow before the JS module
138
+ * loads and the shadow DOM takes over. Trigger slots stay visible. */
139
+ dom-dialog:not(:defined) > *:not([slot="trigger"]),
140
+ dom-popover:not(:defined) > *:not([slot="trigger"]) {
141
+ display: none;
142
+ }
143
+
144
+ /* Shiki code blocks. Shiki emits dual-theme styles in one render — the inline
145
+ * styles carry the light colours and the dark colours as CSS variables.
146
+ * Override those vars when [data-theme="dark"] is on the root. */
147
+ .dom-shiki {
148
+ min-width: 0;
149
+ max-width: 100%;
150
+ overflow-x: auto;
151
+ }
152
+ .dom-shiki .shiki {
153
+ box-sizing: border-box;
154
+ margin: 0;
155
+ min-width: 0;
156
+ max-width: 100%;
157
+ overflow-x: auto;
158
+ padding: 1rem;
159
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
160
+ font-size: 12.5px;
161
+ line-height: 1.65;
162
+ }
163
+ .dom-shiki .shiki,
164
+ .dom-shiki .shiki code {
165
+ background-color: inherit;
166
+ }
167
+ [data-theme="dark"] .dom-shiki .shiki:not([data-theme="light"] *),
168
+ [data-theme="dark"] .dom-shiki .shiki span:not([data-theme="light"] *),
169
+ .dom-code[data-theme="dark"] > .dom-shiki .shiki,
170
+ .dom-code[data-theme="dark"] > .dom-shiki .shiki span {
171
+ color: var(--shiki-dark) !important;
172
+ background-color: var(--shiki-dark-bg) !important;
173
+ }
174
+ [data-theme="dark"] .dom-shiki .shiki span:not([data-theme="light"] *),
175
+ .dom-code[data-theme="dark"] > .dom-shiki .shiki span {
176
+ font-style: var(--shiki-dark-font-style) !important;
177
+ font-weight: var(--shiki-dark-font-weight) !important;
178
+ text-decoration: var(--shiki-dark-text-decoration) !important;
179
+ }
180
+ [data-theme="dark"] .dom-code-token:not([data-theme="light"] *) {
181
+ background-color: var(--shiki-dark-bg) !important;
182
+ color: var(--shiki-dark) !important;
183
+ font-style: var(--shiki-dark-font-style) !important;
184
+ font-weight: var(--shiki-dark-font-weight) !important;
185
+ text-decoration: var(--shiki-dark-text-decoration) !important;
186
+ }
187
+
188
+ @layer components {
189
+ .skin-input {
190
+ background-color: var(--skin-input-bg, var(--canvas));
191
+ background-image: var(--skin-input-bg-image, none);
192
+ border-color: var(--skin-input-border, var(--input));
193
+ border-style: var(--skin-input-border-style, solid);
194
+ border-width: var(--skin-input-border-width, 1px);
195
+ box-shadow: var(--skin-input-shadow, inset 0 1px 2px rgb(15 23 42 / 0.1));
196
+ color: var(--skin-input-fg, var(--canvas-fg));
197
+ backdrop-filter: var(--skin-input-backdrop, none);
198
+ -webkit-backdrop-filter: var(--skin-input-backdrop, none);
199
+ @apply w-full rounded-lg px-3 py-2 text-sm outline-none transition placeholder:text-muted-fg focus:border-ring focus:ring-2 focus:ring-ring/30 disabled:opacity-50;
200
+ }
201
+
202
+ dom-dropdown[open] > [slot="trigger"].skin-input,
203
+ dom-dropdown[open] > [data-trigger].skin-input {
204
+ @apply border-ring ring-2 ring-ring/30;
205
+ }
206
+
207
+ .dom-floating-transition {
208
+ --dom-floating-enter-x: 0px;
209
+ --dom-floating-enter-y: -10px;
210
+ --dom-floating-origin: top center;
211
+ --dom-floating-scale: 0.975;
212
+ --dom-floating-enter-opacity-duration: 190ms;
213
+ --dom-floating-enter-transform-duration: 260ms;
214
+ --dom-floating-leave-opacity-duration: 190ms;
215
+ --dom-floating-leave-transform-duration: 260ms;
216
+ --dom-floating-enter-easing: cubic-bezier(0.16, 1, 0.3, 1);
217
+ --dom-floating-leave-easing: cubic-bezier(0.25, 0.1, 0.25, 1);
218
+ --dom-popover-arrow-x: 50%;
219
+ --dom-popover-arrow-y: auto;
220
+ opacity: 0;
221
+ transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale));
222
+ transform-origin: var(--dom-floating-origin);
223
+ transition:
224
+ opacity var(--dom-floating-enter-opacity-duration) var(--dom-floating-enter-easing),
225
+ transform var(--dom-floating-enter-transform-duration) var(--dom-floating-enter-easing);
226
+ will-change: opacity, transform;
227
+ animation: none;
228
+ }
229
+
230
+ @keyframes dom-floating-scale-fade-opacity-in {
231
+ from { opacity: 0; }
232
+ to { opacity: 1; }
233
+ }
234
+
235
+ @keyframes dom-floating-scale-fade-opacity-out {
236
+ from { opacity: 1; }
237
+ to { opacity: 0; }
238
+ }
239
+
240
+ @keyframes dom-floating-scale-fade-transform-in {
241
+ from { transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale)); }
242
+ to { transform: translate3d(0, 0, 0) scale(1); }
243
+ }
244
+
245
+ @keyframes dom-floating-scale-fade-transform-out {
246
+ from { transform: translate3d(0, 0, 0) scale(1); }
247
+ to { transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale)); }
248
+ }
249
+
250
+ .dom-floating-transition:popover-open,
251
+ .dom-floating-transition[data-floating-open="true"] {
252
+ opacity: 1;
253
+ transform: translate3d(0, 0, 0) scale(1);
254
+ }
255
+
256
+ .dom-floating-transition[data-entering="from"]:popover-open,
257
+ .dom-floating-transition[data-entering="from"][data-floating-open="true"],
258
+ .dom-floating-transition[data-leaving="to"]:popover-open,
259
+ .dom-floating-transition[data-leaving="to"][data-floating-open="true"] {
260
+ opacity: 0;
261
+ transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale));
262
+ }
263
+
264
+ .dom-floating-transition[data-entering="to"]:popover-open,
265
+ .dom-floating-transition[data-entering="to"][data-floating-open="true"],
266
+ .dom-floating-transition[data-leaving="from"]:popover-open,
267
+ .dom-floating-transition[data-leaving="from"][data-floating-open="true"] {
268
+ opacity: 1;
269
+ transform: translate3d(0, 0, 0) scale(1);
270
+ }
271
+
272
+ .dom-floating-transition[data-floating-effect="scale-fade"][data-entering="to"]:popover-open,
273
+ .dom-floating-transition[data-floating-effect="scale-fade"][data-entering="to"][data-floating-open="true"] {
274
+ animation:
275
+ dom-floating-scale-fade-opacity-in var(--dom-floating-enter-opacity-duration) var(--dom-floating-enter-easing) both,
276
+ dom-floating-scale-fade-transform-in var(--dom-floating-enter-transform-duration) var(--dom-floating-enter-easing) both;
277
+ }
278
+
279
+ .dom-floating-transition[data-leaving="to"]:popover-open {
280
+ transition:
281
+ opacity var(--dom-floating-leave-opacity-duration) linear,
282
+ transform var(--dom-floating-leave-transform-duration) var(--dom-floating-leave-easing);
283
+ }
284
+
285
+ .dom-floating-transition[data-leaving="to"][data-floating-open="true"] {
286
+ transition:
287
+ opacity var(--dom-floating-leave-opacity-duration) linear,
288
+ transform var(--dom-floating-leave-transform-duration) var(--dom-floating-leave-easing);
289
+ }
290
+
291
+ .dom-floating-transition[data-floating-effect="scale-fade"][data-leaving="to"]:popover-open,
292
+ .dom-floating-transition[data-floating-effect="scale-fade"][data-leaving="to"][data-floating-open="true"] {
293
+ transition: none;
294
+ animation:
295
+ dom-floating-scale-fade-opacity-out var(--dom-floating-leave-opacity-duration) linear both,
296
+ dom-floating-scale-fade-transform-out var(--dom-floating-leave-transform-duration) var(--dom-floating-leave-easing) both;
297
+ }
298
+
299
+ @starting-style {
300
+ .dom-floating-transition:popover-open {
301
+ opacity: 0;
302
+ transform: translate3d(var(--dom-floating-enter-x), var(--dom-floating-enter-y), 0) scale(var(--dom-floating-scale));
303
+ }
304
+ }
305
+
306
+ .dom-floating-transition:not([data-animate-placement]) {
307
+ transition-property: opacity;
308
+ }
309
+
310
+ .dom-floating-transition[data-side="top"] {
311
+ --dom-floating-enter-y: 10px;
312
+ --dom-floating-origin: bottom center;
313
+ }
314
+
315
+ .dom-floating-transition[data-side="bottom"] {
316
+ --dom-floating-enter-y: -10px;
317
+ --dom-floating-origin: top center;
318
+ }
319
+
320
+ .dom-floating-transition[data-side="left"] {
321
+ --dom-floating-enter-x: 10px;
322
+ --dom-floating-enter-y: 0px;
323
+ --dom-floating-origin: center right;
324
+ }
325
+
326
+ .dom-floating-transition[data-side="right"] {
327
+ --dom-floating-enter-x: -10px;
328
+ --dom-floating-enter-y: 0px;
329
+ --dom-floating-origin: center left;
330
+ }
331
+
332
+ .dom-floating-transition[data-floating-effect="fade"] {
333
+ --dom-floating-enter-x: 0px;
334
+ --dom-floating-enter-y: 0px;
335
+ --dom-floating-scale: 1;
336
+ --dom-floating-enter-transform-duration: 0ms;
337
+ --dom-floating-leave-transform-duration: 0ms;
338
+ }
339
+
340
+ [data-invalid] .skin-input,
341
+ .skin-input[data-invalid] {
342
+ @apply border-destructive focus:border-destructive focus:ring-destructive/25;
343
+ }
344
+
345
+ [data-invalid] dom-dropdown[open] > [slot="trigger"].skin-input,
346
+ [data-invalid] dom-dropdown[open] > [data-trigger].skin-input,
347
+ dom-dropdown[open] > [slot="trigger"].skin-input[aria-invalid="true"],
348
+ dom-dropdown[open] > [data-trigger].skin-input[aria-invalid="true"] {
349
+ @apply border-destructive ring-2 ring-destructive/25;
350
+ }
351
+ }
package/src/theme.css ADDED
@@ -0,0 +1,86 @@
1
+ :root,
2
+ [data-theme="light"] {
3
+ color-scheme: light;
4
+ --radius: 0.625rem;
5
+ --shadow-xs: 0 1px 1px 0 rgb(15 23 42 / 0.04);
6
+ --shadow-sm: 0 1px 2px 0 rgb(15 23 42 / 0.06);
7
+ --shadow-md: 0 3px 8px -2px rgb(15 23 42 / 0.12), 0 1px 2px -1px rgb(15 23 42 / 0.08);
8
+ --shadow-lg: 0 8px 20px -6px rgb(15 23 42 / 0.16), 0 2px 6px -2px rgb(15 23 42 / 0.08);
9
+ --shadow-xl: 0 18px 44px -18px rgb(15 23 42 / 0.24), 0 8px 18px -12px rgb(15 23 42 / 0.16);
10
+ --shadow-2xl: 0 24px 60px -18px rgb(15 23 42 / 0.24), 0 8px 20px -10px rgb(15 23 42 / 0.14);
11
+ --canvas: #fff;
12
+ --canvas-fg: oklch(0.145 0 0);
13
+ --primary: oklch(0.205 0 0);
14
+ --primary-fg: oklch(0.985 0 0);
15
+ --secondary: oklch(0.97 0 0);
16
+ --secondary-fg: oklch(0.205 0 0);
17
+ --muted: oklch(0.97 0 0);
18
+ --muted-fg: oklch(0.5 0 0);
19
+ --accent: oklch(0.97 0 0);
20
+ --accent-fg: oklch(0.205 0 0);
21
+ --destructive: oklch(0.577 0.245 27.325);
22
+ --destructive-fg: oklch(0.985 0 0);
23
+ --success: oklch(0.57 0.194 149.35);
24
+ --success-fg: oklch(0.985 0 0);
25
+ --warning: oklch(0.7 0.2 84);
26
+ --warning-fg: oklch(0.28 0.07 46);
27
+ --border: oklch(0.922 0 0);
28
+ --input: oklch(0.922 0 0);
29
+ --ring: oklch(0.708 0 0);
30
+ }
31
+
32
+ [data-theme="dark"] {
33
+ color-scheme: dark;
34
+ --shadow-xs: 0 1px 1px 0 rgb(0 0 0 / 0.28);
35
+ --shadow-sm: 0 1px 0 0 rgb(255 255 255 / 0.04) inset, 0 1px 2px 0 rgb(0 0 0 / 0.34);
36
+ --shadow-md: 0 1px 0 0 rgb(255 255 255 / 0.04) inset, 0 8px 18px -10px rgb(0 0 0 / 0.52), 0 2px 5px -3px rgb(0 0 0 / 0.44);
37
+ --shadow-lg: 0 1px 0 0 rgb(255 255 255 / 0.05) inset, 0 16px 34px -18px rgb(0 0 0 / 0.58), 0 5px 12px -8px rgb(0 0 0 / 0.5);
38
+ --shadow-xl: 0 1px 0 0 rgb(255 255 255 / 0.05) inset, 0 24px 52px -24px rgb(0 0 0 / 0.68), 0 10px 22px -14px rgb(0 0 0 / 0.56);
39
+ --shadow-2xl: 0 1px 0 0 rgb(255 255 255 / 0.06) inset, 0 34px 76px -30px rgb(0 0 0 / 0.72), 0 16px 34px -20px rgb(0 0 0 / 0.58);
40
+ --canvas: oklch(0.145 0 0);
41
+ --canvas-fg: oklch(0.985 0 0);
42
+ --primary: oklch(0.922 0 0);
43
+ --primary-fg: oklch(0.205 0 0);
44
+ --secondary: oklch(0.269 0 0);
45
+ --secondary-fg: oklch(0.985 0 0);
46
+ --muted: oklch(0.269 0 0);
47
+ --muted-fg: oklch(0.708 0 0);
48
+ --accent: oklch(0.269 0 0);
49
+ --accent-fg: oklch(0.985 0 0);
50
+ --destructive: oklch(0.704 0.191 22.216);
51
+ --destructive-fg: oklch(0.985 0 0);
52
+ --success: oklch(0.696 0.17 162.48);
53
+ --success-fg: oklch(0.145 0 0);
54
+ --warning: oklch(0.769 0.188 70.08);
55
+ --warning-fg: oklch(0.145 0 0);
56
+ --border: oklch(1 0 0 / 10%);
57
+ --input: oklch(1 0 0 / 15%);
58
+ --ring: oklch(0.556 0 0);
59
+ }
60
+
61
+ * {
62
+ box-sizing: border-box;
63
+ }
64
+
65
+ html,
66
+ body,
67
+ #app {
68
+ min-height: 100%;
69
+ }
70
+
71
+ body {
72
+ margin: 0;
73
+ font-family:
74
+ "Plus Jakarta Sans Variable",
75
+ "Plus Jakarta Sans",
76
+ ui-sans-serif,
77
+ system-ui,
78
+ -apple-system,
79
+ BlinkMacSystemFont,
80
+ "Segoe UI",
81
+ sans-serif;
82
+ background: var(--canvas);
83
+ color: var(--canvas-fg);
84
+ text-rendering: optimizeLegibility;
85
+ -webkit-font-smoothing: antialiased;
86
+ }