@atmo-dev/kit 0.0.0-stage → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +214 -2
  3. package/dist/components/Avatar.svelte +35 -0
  4. package/dist/components/Avatar.svelte.d.ts +9 -0
  5. package/dist/components/Badge.svelte +21 -0
  6. package/dist/components/Badge.svelte.d.ts +7 -0
  7. package/dist/components/Button.svelte +94 -0
  8. package/dist/components/Button.svelte.d.ts +13 -0
  9. package/dist/components/Checkbox.svelte +29 -0
  10. package/dist/components/Checkbox.svelte.d.ts +8 -0
  11. package/dist/components/Heading.svelte +24 -0
  12. package/dist/components/Heading.svelte.d.ts +8 -0
  13. package/dist/components/Icon.svelte +24 -0
  14. package/dist/components/Icon.svelte.d.ts +8 -0
  15. package/dist/components/IconButton.svelte +24 -0
  16. package/dist/components/IconButton.svelte.d.ts +8 -0
  17. package/dist/components/IconRail.svelte +186 -0
  18. package/dist/components/IconRail.svelte.d.ts +26 -0
  19. package/dist/components/InlineEditor.svelte +120 -0
  20. package/dist/components/InlineEditor.svelte.d.ts +19 -0
  21. package/dist/components/Input.svelte +32 -0
  22. package/dist/components/Input.svelte.d.ts +9 -0
  23. package/dist/components/InsetImage.svelte +29 -0
  24. package/dist/components/InsetImage.svelte.d.ts +9 -0
  25. package/dist/components/Label.svelte +19 -0
  26. package/dist/components/Label.svelte.d.ts +7 -0
  27. package/dist/components/LinkCard.svelte +47 -0
  28. package/dist/components/LinkCard.svelte.d.ts +12 -0
  29. package/dist/components/Modal.svelte +93 -0
  30. package/dist/components/Modal.svelte.d.ts +12 -0
  31. package/dist/components/NestedComments.svelte +61 -0
  32. package/dist/components/NestedComments.svelte.d.ts +8 -0
  33. package/dist/components/Popover.svelte +49 -0
  34. package/dist/components/Popover.svelte.d.ts +12 -0
  35. package/dist/components/PostComposer.svelte +41 -0
  36. package/dist/components/PostComposer.svelte.d.ts +16 -0
  37. package/dist/components/PostContent.svelte +62 -0
  38. package/dist/components/PostContent.svelte.d.ts +8 -0
  39. package/dist/components/PostVideo.svelte +74 -0
  40. package/dist/components/PostVideo.svelte.d.ts +9 -0
  41. package/dist/components/Select.svelte +34 -0
  42. package/dist/components/Select.svelte.d.ts +9 -0
  43. package/dist/components/Subheading.svelte +22 -0
  44. package/dist/components/Subheading.svelte.d.ts +8 -0
  45. package/dist/components/Surface.svelte +40 -0
  46. package/dist/components/Surface.svelte.d.ts +11 -0
  47. package/dist/components/Tabs.svelte +47 -0
  48. package/dist/components/Tabs.svelte.d.ts +16 -0
  49. package/dist/components/Textarea.svelte +20 -0
  50. package/dist/components/Textarea.svelte.d.ts +7 -0
  51. package/dist/components/ToggleGroup.svelte +32 -0
  52. package/dist/components/ToggleGroup.svelte.d.ts +12 -0
  53. package/dist/components/ToggleGroupItem.svelte +26 -0
  54. package/dist/components/ToggleGroupItem.svelte.d.ts +8 -0
  55. package/dist/components/WorkspaceSidebar.svelte +82 -0
  56. package/dist/components/WorkspaceSidebar.svelte.d.ts +10 -0
  57. package/dist/components/login/ActorSearchField.svelte +238 -0
  58. package/dist/components/login/ActorSearchField.svelte.d.ts +19 -0
  59. package/dist/components/login/AtmosphereApps.svelte +19 -0
  60. package/dist/components/login/AtmosphereApps.svelte.d.ts +18 -0
  61. package/dist/components/login/LoginDialog.svelte +78 -0
  62. package/dist/components/login/LoginDialog.svelte.d.ts +9 -0
  63. package/dist/components/login/LoginForm.svelte +402 -0
  64. package/dist/components/login/LoginForm.svelte.d.ts +28 -0
  65. package/dist/components/login/RecentAccounts.svelte +57 -0
  66. package/dist/components/login/RecentAccounts.svelte.d.ts +10 -0
  67. package/dist/components/login/brands/README.md +7 -0
  68. package/dist/components/login/brands/blacksky.svg +3 -0
  69. package/dist/components/login/brands/bluesky.svg +3 -0
  70. package/dist/components/login/brands/bookhive.svg +3 -0
  71. package/dist/components/login/brands/graze.svg +3 -0
  72. package/dist/components/login/brands/leaflet.svg +3 -0
  73. package/dist/components/login/brands/pckt.svg +3 -0
  74. package/dist/components/login/brands/surf.svg +3 -0
  75. package/dist/components/login/brands/tangled.svg +3 -0
  76. package/dist/components/login/handle.d.ts +3 -0
  77. package/dist/components/login/handle.js +11 -0
  78. package/dist/components/login/permissions.d.ts +3 -0
  79. package/dist/components/login/permissions.js +13 -0
  80. package/dist/components/login/recent-accounts.d.ts +16 -0
  81. package/dist/components/login/recent-accounts.js +87 -0
  82. package/dist/components/login/search.d.ts +9 -0
  83. package/dist/components/login/search.js +47 -0
  84. package/dist/components/login/types.d.ts +27 -0
  85. package/dist/components/login/types.js +1 -0
  86. package/dist/confetti.d.ts +2 -0
  87. package/dist/confetti.js +13 -0
  88. package/dist/index.d.ts +51 -0
  89. package/dist/index.js +39 -0
  90. package/dist/palettes.d.ts +2 -0
  91. package/dist/palettes.js +30 -0
  92. package/dist/social/mention-suggestions.d.ts +35 -0
  93. package/dist/social/mention-suggestions.js +122 -0
  94. package/dist/social/posts.d.ts +95 -0
  95. package/dist/social/posts.js +59 -0
  96. package/dist/social/richtext.d.ts +25 -0
  97. package/dist/social/richtext.js +100 -0
  98. package/dist/styles.d.ts +2 -0
  99. package/dist/styles.js +3 -0
  100. package/dist/theme.css +503 -0
  101. package/dist/theme.d.ts +2 -0
  102. package/dist/theme.js +23 -0
  103. package/dist/utils.d.ts +2 -0
  104. package/dist/utils.js +6 -0
  105. package/package.json +99 -3
@@ -0,0 +1,100 @@
1
+ import { tokenize } from '@atcute/bluesky-richtext-parser';
2
+ export function safeWebUrl(url) {
3
+ if (!url)
4
+ return undefined;
5
+ try {
6
+ const parsed = new URL(url);
7
+ return ['https:', 'http:'].includes(parsed.protocol) ? parsed.href : undefined;
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ export function textToDoc(text) {
14
+ return {
15
+ type: 'doc',
16
+ content: text
17
+ .split('\n')
18
+ .map((line) => ({ type: 'paragraph', content: line ? [{ type: 'text', text: line }] : [] }))
19
+ };
20
+ }
21
+ /** Serialize mention nodes first, then detect links/tags using UTF-8 byte offsets. */
22
+ export function editorJsonToBlueskyPost(doc) {
23
+ let text = '';
24
+ const mentions = [];
25
+ const bytes = (value) => new TextEncoder().encode(value).length;
26
+ function visit(node) {
27
+ if (node.type === 'text')
28
+ text += node.text ?? '';
29
+ else if (node.type === 'hardBreak')
30
+ text += '\n';
31
+ else if (node.type === 'mention') {
32
+ const label = `@${node.attrs?.label ?? node.attrs?.id ?? ''}`;
33
+ const byteStart = bytes(text);
34
+ text += label;
35
+ if (typeof node.attrs?.id === 'string' && node.attrs.id.startsWith('did:'))
36
+ mentions.push({
37
+ index: { byteStart, byteEnd: bytes(text) },
38
+ features: [{ $type: 'app.bsky.richtext.facet#mention', did: node.attrs.id }]
39
+ });
40
+ }
41
+ else
42
+ node.content?.forEach(visit);
43
+ }
44
+ (doc.content ?? []).forEach((node, index) => {
45
+ if (index)
46
+ text += '\n';
47
+ visit(node);
48
+ });
49
+ const facets = [...mentions];
50
+ let byteStart = 0;
51
+ for (const token of tokenize(text)) {
52
+ const byteEnd = byteStart + bytes(token.raw);
53
+ if (!mentions.some((m) => byteStart < m.index.byteEnd && byteEnd > m.index.byteStart)) {
54
+ if (token.type === 'autolink')
55
+ facets.push({
56
+ index: { byteStart, byteEnd },
57
+ features: [{ $type: 'app.bsky.richtext.facet#link', uri: token.url }]
58
+ });
59
+ if (token.type === 'topic')
60
+ facets.push({
61
+ index: { byteStart, byteEnd },
62
+ features: [{ $type: 'app.bsky.richtext.facet#tag', tag: token.name }]
63
+ });
64
+ }
65
+ byteStart = byteEnd;
66
+ }
67
+ return { text, facets: facets.sort((a, b) => a.index.byteStart - b.index.byteStart) };
68
+ }
69
+ export function richTextSegments(text, facets = []) {
70
+ const encoded = new TextEncoder().encode(text);
71
+ const decoder = new TextDecoder();
72
+ const segments = [];
73
+ let cursor = 0;
74
+ for (const facet of [...facets].sort((a, b) => a.index.byteStart - b.index.byteStart)) {
75
+ const { byteStart, byteEnd } = facet.index;
76
+ if (!Number.isInteger(byteStart) ||
77
+ !Number.isInteger(byteEnd) ||
78
+ byteStart < cursor ||
79
+ byteEnd <= byteStart ||
80
+ byteEnd > encoded.length)
81
+ continue;
82
+ const feature = facet.features?.[0];
83
+ const href = feature?.did
84
+ ? `https://bsky.app/profile/${encodeURIComponent(feature.did)}`
85
+ : feature?.uri
86
+ ? safeWebUrl(feature.uri)
87
+ : feature?.tag
88
+ ? `https://bsky.app/hashtag/${encodeURIComponent(feature.tag)}`
89
+ : undefined;
90
+ segments.push({ text: decoder.decode(encoded.slice(cursor, byteStart)) });
91
+ segments.push({ text: decoder.decode(encoded.slice(byteStart, byteEnd)), href });
92
+ cursor = byteEnd;
93
+ }
94
+ segments.push({ text: decoder.decode(encoded.slice(cursor)) });
95
+ return segments;
96
+ }
97
+ export function graphemeLength(text) {
98
+ return Array.from(new Intl.Segmenter(undefined, { granularity: 'grapheme' }).segment(text))
99
+ .length;
100
+ }
@@ -0,0 +1,2 @@
1
+ export declare const focus = "focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-focus";
2
+ export declare const control = "block min-h-11 w-full min-w-0 rounded-ui border border-control-line bg-field px-3 py-2.5 text-base leading-normal text-ink shadow-(--ui-recess-shadow) placeholder:text-muted transition-colors duration-(--atmo-duration) motion-reduce:transition-none hover:border-control-hover focus:ring-0 focus:ring-offset-0 focus-visible:border-focus focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-focus disabled:cursor-not-allowed disabled:opacity-45 disabled:hover:border-control-line aria-invalid:border-action aria-invalid:hover:border-action sm:text-sm";
package/dist/styles.js ADDED
@@ -0,0 +1,3 @@
1
+ // Shared Tailwind recipes, not an additional component stylesheet.
2
+ export const focus = 'focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-focus';
3
+ export const control = 'block min-h-11 w-full min-w-0 rounded-ui border border-control-line bg-field px-3 py-2.5 text-base leading-normal text-ink shadow-(--ui-recess-shadow) placeholder:text-muted transition-colors duration-(--atmo-duration) motion-reduce:transition-none hover:border-control-hover focus:ring-0 focus:ring-offset-0 focus-visible:border-focus focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-focus disabled:cursor-not-allowed disabled:opacity-45 disabled:hover:border-control-line aria-invalid:border-action aria-invalid:hover:border-action sm:text-sm';
package/dist/theme.css ADDED
@@ -0,0 +1,503 @@
1
+ @import '@fontsource-variable/figtree';
2
+
3
+ /* Resolve relative to this stylesheet in src/lib or the packaged dist directory. */
4
+ @source './';
5
+
6
+ @theme inline {
7
+ --color-base-50: var(--base-50);
8
+ --color-base-100: var(--base-100);
9
+ --color-base-200: var(--base-200);
10
+ --color-base-300: var(--base-300);
11
+ --color-base-400: var(--base-400);
12
+ --color-base-500: var(--base-500);
13
+ --color-base-600: var(--base-600);
14
+ --color-base-700: var(--base-700);
15
+ --color-base-800: var(--base-800);
16
+ --color-base-900: var(--base-900);
17
+ --color-base-950: var(--base-950);
18
+ --color-accent-50: var(--accent-50);
19
+ --color-accent-100: var(--accent-100);
20
+ --color-accent-200: var(--accent-200);
21
+ --color-accent-300: var(--accent-300);
22
+ --color-accent-400: var(--accent-400);
23
+ --color-accent-500: var(--accent-500);
24
+ --color-accent-600: var(--accent-600);
25
+ --color-accent-700: var(--accent-700);
26
+ --color-accent-800: var(--accent-800);
27
+ --color-accent-900: var(--accent-900);
28
+ --color-accent-950: var(--accent-950);
29
+ --color-page: var(--ui-page);
30
+ --color-recess: var(--ui-recess);
31
+ --color-surface: var(--ui-surface);
32
+ --color-ink: var(--ui-ink);
33
+ --color-muted: var(--ui-muted);
34
+ --color-line: var(--ui-line);
35
+ --color-control-line: var(--ui-control-line);
36
+ --color-control-hover: var(--ui-control-hover);
37
+ --color-field: var(--ui-field);
38
+ --color-action: var(--ui-action);
39
+ --color-on-action: var(--ui-on-action);
40
+ --color-action-hover: var(--ui-action-hover);
41
+ --color-accent-soft: var(--ui-accent-soft);
42
+ --color-focus: var(--ui-focus);
43
+ --font-sans: var(--atmo-font-sans);
44
+ --radius-ui: var(--atmo-radius-control);
45
+ --radius-panel: var(--atmo-radius-panel);
46
+ }
47
+
48
+ @layer base {
49
+ :root {
50
+ --base-50: var(--color-zinc-50);
51
+ --base-100: var(--color-zinc-100);
52
+ --base-200: var(--color-zinc-200);
53
+ --base-300: var(--color-zinc-300);
54
+ --base-400: var(--color-zinc-400);
55
+ --base-500: var(--color-zinc-500);
56
+ --base-600: var(--color-zinc-600);
57
+ --base-700: var(--color-zinc-700);
58
+ --base-800: var(--color-zinc-800);
59
+ --base-900: var(--color-zinc-900);
60
+ --base-950: var(--color-zinc-950);
61
+ --accent-50: var(--color-pink-50);
62
+ --accent-100: var(--color-pink-100);
63
+ --accent-200: var(--color-pink-200);
64
+ --accent-300: var(--color-pink-300);
65
+ --accent-400: var(--color-pink-400);
66
+ --accent-500: var(--color-pink-500);
67
+ --accent-600: var(--color-pink-600);
68
+ --accent-700: var(--color-pink-700);
69
+ --accent-800: var(--color-pink-800);
70
+ --accent-900: var(--color-pink-900);
71
+ --accent-950: var(--color-pink-950);
72
+ --atmo-font-sans: 'Figtree Variable', ui-sans-serif, system-ui, sans-serif;
73
+ --atmo-radius-control: 10px 12px 9px 11px / 11px 9px 12px 10px;
74
+ --atmo-radius-button: 11px 13px 10px 12px / 12px 10px 13px 11px;
75
+ --atmo-radius-panel: 24px 21px 25px 22px / 22px 25px 21px 24px;
76
+ --atmo-duration: 120ms;
77
+ color-scheme: light dark;
78
+ }
79
+ :where(.dark, [data-theme='dark']) {
80
+ color-scheme: dark;
81
+ }
82
+ :where(.light, [data-theme='light']) {
83
+ color-scheme: light;
84
+ }
85
+
86
+ /* Recompute semantic tokens at palette boundaries, not only at :root.
87
+ A red button inside a blue section must resolve its own complete palette.
88
+ Add atmo-theme to a custom-ramp boundary to get the same behavior. */
89
+ :where(
90
+ :root,
91
+ .atmo,
92
+ .atmo-theme,
93
+ .gray,
94
+ .zinc,
95
+ .neutral,
96
+ .stone,
97
+ .slate,
98
+ .mist,
99
+ .mauve,
100
+ .olive,
101
+ .taupe,
102
+ .sand,
103
+ .sage,
104
+ .red,
105
+ .orange,
106
+ .amber,
107
+ .yellow,
108
+ .lime,
109
+ .green,
110
+ .emerald,
111
+ .teal,
112
+ .cyan,
113
+ .sky,
114
+ .blue,
115
+ .indigo,
116
+ .violet,
117
+ .purple,
118
+ .fuchsia,
119
+ .pink,
120
+ .rose
121
+ ) {
122
+ --ui-page: light-dark(var(--base-50), color-mix(in srgb, var(--base-900) 50%, var(--base-950)));
123
+ --ui-recess: light-dark(
124
+ color-mix(in srgb, var(--base-100) 75%, var(--base-200)),
125
+ var(--base-950)
126
+ );
127
+ --ui-surface: light-dark(var(--base-50), var(--base-900));
128
+ --ui-ink: light-dark(var(--base-950), var(--base-50));
129
+ --ui-muted: light-dark(var(--base-600), var(--base-400));
130
+ --ui-line: light-dark(
131
+ var(--base-300),
132
+ color-mix(in srgb, var(--base-800) 80%, var(--base-950))
133
+ );
134
+ --ui-field: light-dark(
135
+ color-mix(in srgb, var(--base-100) 75%, var(--base-200)),
136
+ color-mix(in srgb, var(--base-950) 80%, black)
137
+ );
138
+ --ui-control-line: light-dark(var(--base-300), var(--base-800));
139
+ --ui-control-hover: light-dark(var(--base-400), var(--base-700));
140
+ --ui-action: light-dark(var(--accent-700), var(--accent-300));
141
+ --ui-on-action: light-dark(var(--accent-50), var(--accent-950));
142
+ --ui-action-hover: light-dark(var(--accent-800), var(--accent-200));
143
+ --ui-accent-soft: light-dark(
144
+ var(--accent-50),
145
+ color-mix(in srgb, var(--accent-950) 65%, var(--base-950))
146
+ );
147
+ --ui-focus: light-dark(var(--accent-700), var(--accent-300));
148
+ --ui-shadow: light-dark(color-mix(in srgb, var(--base-950) 8%, transparent), #0006);
149
+ --ui-shadow-soft: light-dark(color-mix(in srgb, var(--base-950) 2%, transparent), #0002);
150
+ --ui-recess-shadow: inset 0 2px 4px var(--ui-shadow), inset 0 5px 12px var(--ui-shadow-soft);
151
+ }
152
+ .atmo {
153
+ font-family: var(--atmo-font-sans);
154
+ color: var(--ui-ink);
155
+ background: var(--ui-page);
156
+ -webkit-font-smoothing: antialiased;
157
+ }
158
+ .gray {
159
+ --base-50: var(--color-gray-50);
160
+ --base-100: var(--color-gray-100);
161
+ --base-200: var(--color-gray-200);
162
+ --base-300: var(--color-gray-300);
163
+ --base-400: var(--color-gray-400);
164
+ --base-500: var(--color-gray-500);
165
+ --base-600: var(--color-gray-600);
166
+ --base-700: var(--color-gray-700);
167
+ --base-800: var(--color-gray-800);
168
+ --base-900: var(--color-gray-900);
169
+ --base-950: var(--color-gray-950);
170
+ }
171
+ .zinc {
172
+ --base-50: var(--color-zinc-50);
173
+ --base-100: var(--color-zinc-100);
174
+ --base-200: var(--color-zinc-200);
175
+ --base-300: var(--color-zinc-300);
176
+ --base-400: var(--color-zinc-400);
177
+ --base-500: var(--color-zinc-500);
178
+ --base-600: var(--color-zinc-600);
179
+ --base-700: var(--color-zinc-700);
180
+ --base-800: var(--color-zinc-800);
181
+ --base-900: var(--color-zinc-900);
182
+ --base-950: var(--color-zinc-950);
183
+ }
184
+ .neutral {
185
+ --base-50: var(--color-neutral-50);
186
+ --base-100: var(--color-neutral-100);
187
+ --base-200: var(--color-neutral-200);
188
+ --base-300: var(--color-neutral-300);
189
+ --base-400: var(--color-neutral-400);
190
+ --base-500: var(--color-neutral-500);
191
+ --base-600: var(--color-neutral-600);
192
+ --base-700: var(--color-neutral-700);
193
+ --base-800: var(--color-neutral-800);
194
+ --base-900: var(--color-neutral-900);
195
+ --base-950: var(--color-neutral-950);
196
+ }
197
+ .stone {
198
+ --base-50: var(--color-stone-50);
199
+ --base-100: var(--color-stone-100);
200
+ --base-200: var(--color-stone-200);
201
+ --base-300: var(--color-stone-300);
202
+ --base-400: var(--color-stone-400);
203
+ --base-500: var(--color-stone-500);
204
+ --base-600: var(--color-stone-600);
205
+ --base-700: var(--color-stone-700);
206
+ --base-800: var(--color-stone-800);
207
+ --base-900: var(--color-stone-900);
208
+ --base-950: var(--color-stone-950);
209
+ }
210
+ .slate {
211
+ --base-50: var(--color-slate-50);
212
+ --base-100: var(--color-slate-100);
213
+ --base-200: var(--color-slate-200);
214
+ --base-300: var(--color-slate-300);
215
+ --base-400: var(--color-slate-400);
216
+ --base-500: var(--color-slate-500);
217
+ --base-600: var(--color-slate-600);
218
+ --base-700: var(--color-slate-700);
219
+ --base-800: var(--color-slate-800);
220
+ --base-900: var(--color-slate-900);
221
+ --base-950: var(--color-slate-950);
222
+ }
223
+ .mist {
224
+ --base-50: var(--color-mist-50);
225
+ --base-100: var(--color-mist-100);
226
+ --base-200: var(--color-mist-200);
227
+ --base-300: var(--color-mist-300);
228
+ --base-400: var(--color-mist-400);
229
+ --base-500: var(--color-mist-500);
230
+ --base-600: var(--color-mist-600);
231
+ --base-700: var(--color-mist-700);
232
+ --base-800: var(--color-mist-800);
233
+ --base-900: var(--color-mist-900);
234
+ --base-950: var(--color-mist-950);
235
+ }
236
+ .mauve {
237
+ --base-50: var(--color-mauve-50);
238
+ --base-100: var(--color-mauve-100);
239
+ --base-200: var(--color-mauve-200);
240
+ --base-300: var(--color-mauve-300);
241
+ --base-400: var(--color-mauve-400);
242
+ --base-500: var(--color-mauve-500);
243
+ --base-600: var(--color-mauve-600);
244
+ --base-700: var(--color-mauve-700);
245
+ --base-800: var(--color-mauve-800);
246
+ --base-900: var(--color-mauve-900);
247
+ --base-950: var(--color-mauve-950);
248
+ }
249
+ .olive,
250
+ .sage {
251
+ --base-50: var(--color-olive-50);
252
+ --base-100: var(--color-olive-100);
253
+ --base-200: var(--color-olive-200);
254
+ --base-300: var(--color-olive-300);
255
+ --base-400: var(--color-olive-400);
256
+ --base-500: var(--color-olive-500);
257
+ --base-600: var(--color-olive-600);
258
+ --base-700: var(--color-olive-700);
259
+ --base-800: var(--color-olive-800);
260
+ --base-900: var(--color-olive-900);
261
+ --base-950: var(--color-olive-950);
262
+ }
263
+ .taupe,
264
+ .sand {
265
+ --base-50: var(--color-taupe-50);
266
+ --base-100: var(--color-taupe-100);
267
+ --base-200: var(--color-taupe-200);
268
+ --base-300: var(--color-taupe-300);
269
+ --base-400: var(--color-taupe-400);
270
+ --base-500: var(--color-taupe-500);
271
+ --base-600: var(--color-taupe-600);
272
+ --base-700: var(--color-taupe-700);
273
+ --base-800: var(--color-taupe-800);
274
+ --base-900: var(--color-taupe-900);
275
+ --base-950: var(--color-taupe-950);
276
+ }
277
+ .red {
278
+ --accent-50: var(--color-red-50);
279
+ --accent-100: var(--color-red-100);
280
+ --accent-200: var(--color-red-200);
281
+ --accent-300: var(--color-red-300);
282
+ --accent-400: var(--color-red-400);
283
+ --accent-500: var(--color-red-500);
284
+ --accent-600: var(--color-red-600);
285
+ --accent-700: var(--color-red-700);
286
+ --accent-800: var(--color-red-800);
287
+ --accent-900: var(--color-red-900);
288
+ --accent-950: var(--color-red-950);
289
+ }
290
+ .orange {
291
+ --accent-50: var(--color-orange-50);
292
+ --accent-100: var(--color-orange-100);
293
+ --accent-200: var(--color-orange-200);
294
+ --accent-300: var(--color-orange-300);
295
+ --accent-400: var(--color-orange-400);
296
+ --accent-500: var(--color-orange-500);
297
+ --accent-600: var(--color-orange-600);
298
+ --accent-700: var(--color-orange-700);
299
+ --accent-800: var(--color-orange-800);
300
+ --accent-900: var(--color-orange-900);
301
+ --accent-950: var(--color-orange-950);
302
+ }
303
+ .amber {
304
+ --accent-50: var(--color-amber-50);
305
+ --accent-100: var(--color-amber-100);
306
+ --accent-200: var(--color-amber-200);
307
+ --accent-300: var(--color-amber-300);
308
+ --accent-400: var(--color-amber-400);
309
+ --accent-500: var(--color-amber-500);
310
+ --accent-600: var(--color-amber-600);
311
+ --accent-700: var(--color-amber-700);
312
+ --accent-800: var(--color-amber-800);
313
+ --accent-900: var(--color-amber-900);
314
+ --accent-950: var(--color-amber-950);
315
+ }
316
+ .yellow {
317
+ --accent-50: var(--color-yellow-50);
318
+ --accent-100: var(--color-yellow-100);
319
+ --accent-200: var(--color-yellow-200);
320
+ --accent-300: var(--color-yellow-300);
321
+ --accent-400: var(--color-yellow-400);
322
+ --accent-500: var(--color-yellow-500);
323
+ --accent-600: var(--color-yellow-600);
324
+ --accent-700: var(--color-yellow-700);
325
+ --accent-800: var(--color-yellow-800);
326
+ --accent-900: var(--color-yellow-900);
327
+ --accent-950: var(--color-yellow-950);
328
+ }
329
+ .lime {
330
+ --accent-50: var(--color-lime-50);
331
+ --accent-100: var(--color-lime-100);
332
+ --accent-200: var(--color-lime-200);
333
+ --accent-300: var(--color-lime-300);
334
+ --accent-400: var(--color-lime-400);
335
+ --accent-500: var(--color-lime-500);
336
+ --accent-600: var(--color-lime-600);
337
+ --accent-700: var(--color-lime-700);
338
+ --accent-800: var(--color-lime-800);
339
+ --accent-900: var(--color-lime-900);
340
+ --accent-950: var(--color-lime-950);
341
+ }
342
+ .green {
343
+ --accent-50: var(--color-green-50);
344
+ --accent-100: var(--color-green-100);
345
+ --accent-200: var(--color-green-200);
346
+ --accent-300: var(--color-green-300);
347
+ --accent-400: var(--color-green-400);
348
+ --accent-500: var(--color-green-500);
349
+ --accent-600: var(--color-green-600);
350
+ --accent-700: var(--color-green-700);
351
+ --accent-800: var(--color-green-800);
352
+ --accent-900: var(--color-green-900);
353
+ --accent-950: var(--color-green-950);
354
+ }
355
+ .emerald {
356
+ --accent-50: var(--color-emerald-50);
357
+ --accent-100: var(--color-emerald-100);
358
+ --accent-200: var(--color-emerald-200);
359
+ --accent-300: var(--color-emerald-300);
360
+ --accent-400: var(--color-emerald-400);
361
+ --accent-500: var(--color-emerald-500);
362
+ --accent-600: var(--color-emerald-600);
363
+ --accent-700: var(--color-emerald-700);
364
+ --accent-800: var(--color-emerald-800);
365
+ --accent-900: var(--color-emerald-900);
366
+ --accent-950: var(--color-emerald-950);
367
+ }
368
+ .teal {
369
+ --accent-50: var(--color-teal-50);
370
+ --accent-100: var(--color-teal-100);
371
+ --accent-200: var(--color-teal-200);
372
+ --accent-300: var(--color-teal-300);
373
+ --accent-400: var(--color-teal-400);
374
+ --accent-500: var(--color-teal-500);
375
+ --accent-600: var(--color-teal-600);
376
+ --accent-700: var(--color-teal-700);
377
+ --accent-800: var(--color-teal-800);
378
+ --accent-900: var(--color-teal-900);
379
+ --accent-950: var(--color-teal-950);
380
+ }
381
+ .cyan {
382
+ --accent-50: var(--color-cyan-50);
383
+ --accent-100: var(--color-cyan-100);
384
+ --accent-200: var(--color-cyan-200);
385
+ --accent-300: var(--color-cyan-300);
386
+ --accent-400: var(--color-cyan-400);
387
+ --accent-500: var(--color-cyan-500);
388
+ --accent-600: var(--color-cyan-600);
389
+ --accent-700: var(--color-cyan-700);
390
+ --accent-800: var(--color-cyan-800);
391
+ --accent-900: var(--color-cyan-900);
392
+ --accent-950: var(--color-cyan-950);
393
+ }
394
+ .sky {
395
+ --accent-50: var(--color-sky-50);
396
+ --accent-100: var(--color-sky-100);
397
+ --accent-200: var(--color-sky-200);
398
+ --accent-300: var(--color-sky-300);
399
+ --accent-400: var(--color-sky-400);
400
+ --accent-500: var(--color-sky-500);
401
+ --accent-600: var(--color-sky-600);
402
+ --accent-700: var(--color-sky-700);
403
+ --accent-800: var(--color-sky-800);
404
+ --accent-900: var(--color-sky-900);
405
+ --accent-950: var(--color-sky-950);
406
+ }
407
+ .blue {
408
+ --accent-50: var(--color-blue-50);
409
+ --accent-100: var(--color-blue-100);
410
+ --accent-200: var(--color-blue-200);
411
+ --accent-300: var(--color-blue-300);
412
+ --accent-400: var(--color-blue-400);
413
+ --accent-500: var(--color-blue-500);
414
+ --accent-600: var(--color-blue-600);
415
+ --accent-700: var(--color-blue-700);
416
+ --accent-800: var(--color-blue-800);
417
+ --accent-900: var(--color-blue-900);
418
+ --accent-950: var(--color-blue-950);
419
+ }
420
+ .indigo {
421
+ --accent-50: var(--color-indigo-50);
422
+ --accent-100: var(--color-indigo-100);
423
+ --accent-200: var(--color-indigo-200);
424
+ --accent-300: var(--color-indigo-300);
425
+ --accent-400: var(--color-indigo-400);
426
+ --accent-500: var(--color-indigo-500);
427
+ --accent-600: var(--color-indigo-600);
428
+ --accent-700: var(--color-indigo-700);
429
+ --accent-800: var(--color-indigo-800);
430
+ --accent-900: var(--color-indigo-900);
431
+ --accent-950: var(--color-indigo-950);
432
+ }
433
+ .violet {
434
+ --accent-50: var(--color-violet-50);
435
+ --accent-100: var(--color-violet-100);
436
+ --accent-200: var(--color-violet-200);
437
+ --accent-300: var(--color-violet-300);
438
+ --accent-400: var(--color-violet-400);
439
+ --accent-500: var(--color-violet-500);
440
+ --accent-600: var(--color-violet-600);
441
+ --accent-700: var(--color-violet-700);
442
+ --accent-800: var(--color-violet-800);
443
+ --accent-900: var(--color-violet-900);
444
+ --accent-950: var(--color-violet-950);
445
+ }
446
+ .purple {
447
+ --accent-50: var(--color-purple-50);
448
+ --accent-100: var(--color-purple-100);
449
+ --accent-200: var(--color-purple-200);
450
+ --accent-300: var(--color-purple-300);
451
+ --accent-400: var(--color-purple-400);
452
+ --accent-500: var(--color-purple-500);
453
+ --accent-600: var(--color-purple-600);
454
+ --accent-700: var(--color-purple-700);
455
+ --accent-800: var(--color-purple-800);
456
+ --accent-900: var(--color-purple-900);
457
+ --accent-950: var(--color-purple-950);
458
+ }
459
+ .fuchsia {
460
+ --accent-50: var(--color-fuchsia-50);
461
+ --accent-100: var(--color-fuchsia-100);
462
+ --accent-200: var(--color-fuchsia-200);
463
+ --accent-300: var(--color-fuchsia-300);
464
+ --accent-400: var(--color-fuchsia-400);
465
+ --accent-500: var(--color-fuchsia-500);
466
+ --accent-600: var(--color-fuchsia-600);
467
+ --accent-700: var(--color-fuchsia-700);
468
+ --accent-800: var(--color-fuchsia-800);
469
+ --accent-900: var(--color-fuchsia-900);
470
+ --accent-950: var(--color-fuchsia-950);
471
+ }
472
+ .pink {
473
+ --accent-50: var(--color-pink-50);
474
+ --accent-100: var(--color-pink-100);
475
+ --accent-200: var(--color-pink-200);
476
+ --accent-300: var(--color-pink-300);
477
+ --accent-400: var(--color-pink-400);
478
+ --accent-500: var(--color-pink-500);
479
+ --accent-600: var(--color-pink-600);
480
+ --accent-700: var(--color-pink-700);
481
+ --accent-800: var(--color-pink-800);
482
+ --accent-900: var(--color-pink-900);
483
+ --accent-950: var(--color-pink-950);
484
+ }
485
+ .rose {
486
+ --accent-50: var(--color-rose-50);
487
+ --accent-100: var(--color-rose-100);
488
+ --accent-200: var(--color-rose-200);
489
+ --accent-300: var(--color-rose-300);
490
+ --accent-400: var(--color-rose-400);
491
+ --accent-500: var(--color-rose-500);
492
+ --accent-600: var(--color-rose-600);
493
+ --accent-700: var(--color-rose-700);
494
+ --accent-800: var(--color-rose-800);
495
+ --accent-900: var(--color-rose-900);
496
+ --accent-950: var(--color-rose-950);
497
+ }
498
+ @media (prefers-reduced-motion: reduce) {
499
+ :root {
500
+ --atmo-duration: 0ms;
501
+ }
502
+ }
503
+ }
@@ -0,0 +1,2 @@
1
+ export declare function readTheme(element: HTMLElement): string;
2
+ export declare function observeTheme(element: HTMLElement, update: () => void): () => void;
package/dist/theme.js ADDED
@@ -0,0 +1,23 @@
1
+ // Portals leave their original DOM ancestry. Carry the originating palette,
2
+ // semantic tokens, font, and color scheme with them; behavior stays in Bits UI.
3
+ export function readTheme(element) {
4
+ const style = getComputedStyle(element);
5
+ const variables = Array.from(style).filter((name) => ['--base-', '--accent-', '--ui-', '--atmo-'].some((prefix) => name.startsWith(prefix)));
6
+ return [
7
+ `color-scheme:${style.colorScheme}`,
8
+ `font-family:${style.fontFamily}`,
9
+ ...variables.map((name) => `${name}:${style.getPropertyValue(name)}`)
10
+ ].join(';');
11
+ }
12
+ export function observeTheme(element, update) {
13
+ const observer = new MutationObserver(update);
14
+ let parent = element;
15
+ while (parent) {
16
+ observer.observe(parent, {
17
+ attributes: true,
18
+ attributeFilter: ['class', 'style', 'data-theme']
19
+ });
20
+ parent = parent.parentElement;
21
+ }
22
+ return () => observer.disconnect();
23
+ }
@@ -0,0 +1,2 @@
1
+ import { type ClassValue } from 'clsx';
2
+ export declare function cn(...values: ClassValue[]): string;
package/dist/utils.js ADDED
@@ -0,0 +1,6 @@
1
+ import { clsx } from 'clsx';
2
+ import { extendTailwindMerge } from 'tailwind-merge';
3
+ const twMerge = extendTailwindMerge({ extend: { theme: { radius: ['ui', 'panel'] } } });
4
+ export function cn(...values) {
5
+ return twMerge(clsx(values));
6
+ }