@atmo-dev/kit 0.9.0 → 0.10.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 (84) hide show
  1. package/README.md +27 -429
  2. package/dist/components/AccountMenu.svelte +7 -7
  3. package/dist/components/Avatar.svelte +1 -1
  4. package/dist/components/Badge.svelte +3 -3
  5. package/dist/components/Button.svelte +4 -3
  6. package/dist/components/Checkbox.svelte +31 -1
  7. package/dist/{events → components}/DatePicker.svelte +3 -3
  8. package/dist/components/ExternalEmbed.svelte +9 -6
  9. package/dist/components/GrainAlbumPicker.svelte +18 -9
  10. package/dist/components/GrainAlbumView.svelte +15 -6
  11. package/dist/components/Heading.svelte +1 -1
  12. package/dist/components/IconRail.svelte +11 -9
  13. package/dist/components/InlineEditor.svelte +3 -3
  14. package/dist/components/InsetImage.svelte +1 -1
  15. package/dist/components/Label.svelte +1 -1
  16. package/dist/components/LinkCard.svelte +6 -4
  17. package/dist/components/Modal.svelte +3 -3
  18. package/dist/components/NestedComments.svelte +9 -6
  19. package/dist/components/PhotoGrid.svelte +1 -1
  20. package/dist/components/Popover.svelte +1 -1
  21. package/dist/components/PostComposer.svelte +2 -2
  22. package/dist/components/PostContent.svelte +11 -9
  23. package/dist/components/PostVideo.svelte +1 -1
  24. package/dist/components/RichText.svelte +19 -7
  25. package/dist/components/Select.svelte +5 -2
  26. package/dist/components/Select.svelte.d.ts +2 -0
  27. package/dist/components/SocialClientPicker.svelte +1 -1
  28. package/dist/components/StreamplacePicker.svelte +1 -1
  29. package/dist/components/Subheading.svelte +4 -2
  30. package/dist/components/Surface.svelte +3 -2
  31. package/dist/components/Tabs.svelte +2 -2
  32. package/dist/{events → components}/TimePicker.svelte +10 -7
  33. package/dist/{events → components}/TimezonePicker.svelte +15 -7
  34. package/dist/components/ToggleGroup.svelte +1 -1
  35. package/dist/components/ToggleGroupItem.svelte +1 -1
  36. package/dist/components/UserProfile.svelte +16 -9
  37. package/dist/components/WorkspaceSidebar.svelte +1 -1
  38. package/dist/components/legal/LegalDocument.svelte +9 -3
  39. package/dist/components/legal/LegalFooter.svelte +2 -2
  40. package/dist/components/login/ActorSearchField.svelte +10 -6
  41. package/dist/components/login/AtmosphereApps.svelte +1 -1
  42. package/dist/components/login/LoginForm.svelte +15 -9
  43. package/dist/components/login/PermissionFields.svelte +9 -2
  44. package/dist/components/login/RecentAccounts.svelte +5 -3
  45. package/dist/events/EventAttendees.svelte +9 -3
  46. package/dist/events/EventCard.svelte +7 -5
  47. package/dist/events/EventComments.svelte +3 -3
  48. package/dist/events/EventEditor.svelte +20 -9
  49. package/dist/events/EventRsvp.svelte +10 -6
  50. package/dist/events/EventView.svelte +21 -7
  51. package/dist/events/StarterPackButton.svelte +3 -3
  52. package/dist/events/ThemePicker.svelte +7 -7
  53. package/dist/events/ThumbnailPresets.svelte +1 -1
  54. package/dist/events/VodPlayer.svelte +1 -1
  55. package/dist/events/editor/LinksSection.svelte +7 -3
  56. package/dist/events/editor/LocationSection.svelte +1 -1
  57. package/dist/events/editor/RecurringModal.svelte +6 -4
  58. package/dist/events/editor/ThemeSection.svelte +3 -1
  59. package/dist/events/event-view/EventDateBlock.svelte +3 -3
  60. package/dist/events/event-view/EventHostedBy.svelte +6 -2
  61. package/dist/events/event-view/EventLinksList.svelte +2 -2
  62. package/dist/events/event-view/EventLocationBlock.svelte +9 -5
  63. package/dist/events/event-view/EventLocationMap.svelte +4 -2
  64. package/dist/events/schedule/ConferenceTimetable.svelte +7 -7
  65. package/dist/events/schedule/DaySchedule.svelte +2 -2
  66. package/dist/events/schedule/ScheduleEventCell.svelte +2 -2
  67. package/dist/events/themes/Matrix.svelte +12 -6
  68. package/dist/events.d.ts +5 -5
  69. package/dist/events.js +6 -5
  70. package/dist/index.d.ts +5 -0
  71. package/dist/index.js +5 -0
  72. package/dist/social/mention-suggestions.js +4 -4
  73. package/dist/styles.d.ts +2 -2
  74. package/dist/styles.js +2 -2
  75. package/dist/theme.css +23 -44
  76. package/dist/theme.js +4 -12
  77. package/package.json +1 -1
  78. /package/dist/{events → components}/DatePicker.svelte.d.ts +0 -0
  79. /package/dist/{events → components}/DateTimePicker.svelte +0 -0
  80. /package/dist/{events → components}/DateTimePicker.svelte.d.ts +0 -0
  81. /package/dist/{events → components}/ImageDropper.svelte +0 -0
  82. /package/dist/{events → components}/ImageDropper.svelte.d.ts +0 -0
  83. /package/dist/{events → components}/TimePicker.svelte.d.ts +0 -0
  84. /package/dist/{events → components}/TimezonePicker.svelte.d.ts +0 -0
package/dist/events.js CHANGED
@@ -10,8 +10,9 @@ export { default as StarterPackButton } from './events/StarterPackButton.svelte'
10
10
  export { default as VodPlayer } from './events/VodPlayer.svelte';
11
11
  export { default as VodTranscript } from './events/VodTranscript.svelte';
12
12
  export { default as ConferenceTimetable } from './events/schedule/ConferenceTimetable.svelte';
13
- export { default as DatePicker } from './events/DatePicker.svelte';
14
- export { default as TimePicker } from './events/TimePicker.svelte';
15
- export { default as DateTimePicker } from './events/DateTimePicker.svelte';
16
- export { default as TimezonePicker } from './events/TimezonePicker.svelte';
17
- export { default as ImageDropper } from './events/ImageDropper.svelte';
13
+ // Compatibility aliases; general-purpose controls are owned by the main Kit entry.
14
+ export { default as DatePicker } from './components/DatePicker.svelte';
15
+ export { default as TimePicker } from './components/TimePicker.svelte';
16
+ export { default as DateTimePicker } from './components/DateTimePicker.svelte';
17
+ export { default as TimezonePicker } from './components/TimezonePicker.svelte';
18
+ export { default as ImageDropper } from './components/ImageDropper.svelte';
package/dist/index.d.ts CHANGED
@@ -5,6 +5,11 @@ export { default as Input } from './components/Input.svelte';
5
5
  export type { InputProps } from './components/Input.svelte';
6
6
  export { default as Textarea } from './components/Textarea.svelte';
7
7
  export { default as Select } from './components/Select.svelte';
8
+ export { default as DatePicker } from './components/DatePicker.svelte';
9
+ export { default as TimePicker } from './components/TimePicker.svelte';
10
+ export { default as DateTimePicker } from './components/DateTimePicker.svelte';
11
+ export { default as TimezonePicker } from './components/TimezonePicker.svelte';
12
+ export { default as ImageDropper } from './components/ImageDropper.svelte';
8
13
  export { default as SocialClientPicker } from './components/SocialClientPicker.svelte';
9
14
  export type { SocialClientPickerProps } from './components/SocialClientPicker.svelte';
10
15
  export * from './social.js';
package/dist/index.js CHANGED
@@ -3,6 +3,11 @@ export { default as IconButton } from './components/IconButton.svelte';
3
3
  export { default as Input } from './components/Input.svelte';
4
4
  export { default as Textarea } from './components/Textarea.svelte';
5
5
  export { default as Select } from './components/Select.svelte';
6
+ export { default as DatePicker } from './components/DatePicker.svelte';
7
+ export { default as TimePicker } from './components/TimePicker.svelte';
8
+ export { default as DateTimePicker } from './components/DateTimePicker.svelte';
9
+ export { default as TimezonePicker } from './components/TimezonePicker.svelte';
10
+ export { default as ImageDropper } from './components/ImageDropper.svelte';
6
11
  export { default as SocialClientPicker } from './components/SocialClientPicker.svelte';
7
12
  export * from './social.js';
8
13
  export { default as Checkbox } from './components/Checkbox.svelte';
@@ -31,7 +31,7 @@ export function mentionSuggestions(search, host) {
31
31
  empty.role = 'option';
32
32
  empty.setAttribute('aria-disabled', 'true');
33
33
  empty.setAttribute('aria-selected', 'false');
34
- empty.className = 'p-3 text-xs text-muted';
34
+ empty.className = 'p-3 text-xs text-base-600 dark:text-base-400';
35
35
  empty.textContent = 'No accounts found';
36
36
  menu.append(empty);
37
37
  }
@@ -42,12 +42,12 @@ export function mentionSuggestions(search, host) {
42
42
  option.id = `${menu.id}-${index}`;
43
43
  option.setAttribute('aria-selected', String(index === selected));
44
44
  option.className =
45
- 'block w-full rounded-ui px-3 py-2 text-left text-xs text-ink hover:bg-recess aria-selected:bg-recess';
45
+ 'block w-full rounded-ui px-3 py-2 text-left text-xs text-base-950 dark:text-base-50 hover:bg-[color-mix(in_srgb,var(--base-100)_75%,var(--base-200))] dark:hover:bg-base-950 aria-selected:bg-[color-mix(in_srgb,var(--base-100)_75%,var(--base-200))] dark:aria-selected:bg-base-950';
46
46
  const name = document.createElement('strong');
47
47
  name.className = 'block truncate font-medium';
48
48
  name.textContent = actor.displayName || actor.handle;
49
49
  const handle = document.createElement('span');
50
- handle.className = 'block truncate text-muted';
50
+ handle.className = 'block truncate text-base-600 dark:text-base-400';
51
51
  handle.textContent = `@${actor.handle}`;
52
52
  option.append(name, handle);
53
53
  option.onmousedown = (event) => event.preventDefault();
@@ -84,7 +84,7 @@ export function mentionSuggestions(search, host) {
84
84
  menu.role = 'listbox';
85
85
  menu.setAttribute('aria-label', 'Mention suggestions');
86
86
  menu.className =
87
- 'absolute z-60 w-70 max-w-full overflow-hidden rounded-ui border border-line bg-page p-1 font-sans text-ink';
87
+ 'absolute z-60 w-70 max-w-full overflow-hidden rounded-ui border border-base-300 dark:border-[color-mix(in_srgb,var(--base-800)_80%,var(--base-950))] bg-base-50 dark:bg-base-925 p-1 font-sans text-base-950 dark:text-base-50';
88
88
  host().append(menu);
89
89
  draw();
90
90
  },
package/dist/styles.d.ts CHANGED
@@ -1,2 +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";
1
+ export declare const focus = "focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-accent-700 dark:focus-visible:outline-accent-300";
2
+ export declare const control = "block min-h-11 w-full min-w-0 rounded-ui border border-base-300 dark:border-base-800 bg-[color-mix(in_srgb,var(--base-100)_75%,var(--base-200))] dark:bg-base-975 px-3 py-2.5 text-base leading-normal text-base-950 dark:text-base-50 shadow-[inset_0_2px_4px_color-mix(in_srgb,var(--base-950)_8%,transparent),inset_0_5px_12px_color-mix(in_srgb,var(--base-950)_2%,transparent)] dark:shadow-[inset_0_2px_4px_#0006,inset_0_5px_12px_#0002] placeholder:text-base-600 dark:placeholder:text-base-400 transition-colors duration-(--atmo-duration) motion-reduce:transition-none hover:border-base-400 dark:hover:border-base-700 focus:ring-0 focus:ring-offset-0 focus-visible:border-accent-700 dark:focus-visible:border-accent-300 focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-accent-700 dark:focus-visible:outline-accent-300 disabled:cursor-not-allowed disabled:opacity-45 disabled:hover:border-base-300 dark:disabled:hover:border-base-800 aria-invalid:border-accent-700 dark:aria-invalid:border-accent-300 aria-invalid:hover:border-accent-700 dark:aria-invalid:hover:border-accent-300 sm:text-sm";
package/dist/styles.js CHANGED
@@ -1,3 +1,3 @@
1
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';
2
+ export const focus = 'focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-accent-700 dark:focus-visible:outline-accent-300';
3
+ export const control = 'block min-h-11 w-full min-w-0 rounded-ui border border-base-300 dark:border-base-800 bg-[color-mix(in_srgb,var(--base-100)_75%,var(--base-200))] dark:bg-base-975 px-3 py-2.5 text-base leading-normal text-base-950 dark:text-base-50 shadow-[inset_0_2px_4px_color-mix(in_srgb,var(--base-950)_8%,transparent),inset_0_5px_12px_color-mix(in_srgb,var(--base-950)_2%,transparent)] dark:shadow-[inset_0_2px_4px_#0006,inset_0_5px_12px_#0002] placeholder:text-base-600 dark:placeholder:text-base-400 transition-colors duration-(--atmo-duration) motion-reduce:transition-none hover:border-base-400 dark:hover:border-base-700 focus:ring-0 focus:ring-offset-0 focus-visible:border-accent-700 dark:focus-visible:border-accent-300 focus-visible:outline-2 focus-visible:-outline-offset-1 focus-visible:outline-accent-700 dark:focus-visible:outline-accent-300 disabled:cursor-not-allowed disabled:opacity-45 disabled:hover:border-base-300 dark:disabled:hover:border-base-800 aria-invalid:border-accent-700 dark:aria-invalid:border-accent-300 aria-invalid:hover:border-accent-700 dark:aria-invalid:hover:border-accent-300 sm:text-sm';
package/dist/theme.css CHANGED
@@ -4,6 +4,18 @@
4
4
  /* Resolve relative to this stylesheet in src/lib or the packaged dist directory. */
5
5
  @source './';
6
6
 
7
+ /* Explicit document modes win; without one, follow the browser preference. */
8
+ @custom-variant dark {
9
+ &:where(.dark, .dark *, [data-theme='dark'], [data-theme='dark'] *) {
10
+ @slot;
11
+ }
12
+ @media (prefers-color-scheme: dark) {
13
+ &:not(:where(.light, .light *, [data-theme='light'], [data-theme='light'] *)) {
14
+ @slot;
15
+ }
16
+ }
17
+ }
18
+
7
19
  @theme inline {
8
20
  --color-base-50: var(--base-50);
9
21
  --color-base-100: var(--base-100);
@@ -15,7 +27,9 @@
15
27
  --color-base-700: var(--base-700);
16
28
  --color-base-800: var(--base-800);
17
29
  --color-base-900: var(--base-900);
30
+ --color-base-925: var(--base-925);
18
31
  --color-base-950: var(--base-950);
32
+ --color-base-975: var(--base-975);
19
33
  --color-accent-50: var(--accent-50);
20
34
  --color-accent-100: var(--accent-100);
21
35
  --color-accent-200: var(--accent-200);
@@ -26,19 +40,9 @@
26
40
  --color-accent-700: var(--accent-700);
27
41
  --color-accent-800: var(--accent-800);
28
42
  --color-accent-900: var(--accent-900);
43
+ --color-accent-925: var(--accent-925);
29
44
  --color-accent-950: var(--accent-950);
30
- --color-page: var(--ui-page);
31
- --color-recess: var(--ui-recess);
32
- --color-surface: var(--ui-surface);
33
- --color-ink: var(--ui-ink);
34
- --color-muted: var(--ui-muted);
35
- --color-line: var(--ui-line);
36
- --color-control-line: var(--ui-control-line);
37
- --color-control-hover: var(--ui-control-hover);
38
- --color-field: var(--ui-field);
39
- --color-action: var(--ui-action);
40
- --color-accent-soft: var(--ui-accent-soft);
41
- --color-focus: var(--ui-focus);
45
+ --color-accent-975: var(--accent-975);
42
46
  --font-sans: var(--atmo-font-sans);
43
47
  --radius-ui: var(--atmo-radius-control);
44
48
  --radius-panel: var(--atmo-radius-panel);
@@ -82,9 +86,8 @@
82
86
  color-scheme: light;
83
87
  }
84
88
 
85
- /* Recompute semantic tokens at palette boundaries, not only at :root.
86
- A red button inside a blue section must resolve its own complete palette.
87
- Add atmo-theme to a custom-ramp boundary to get the same behavior. */
89
+ /* Derive the extra shades at palette boundaries, including custom ramps
90
+ marked with atmo-theme. Ratios preserve the existing page/field colors. */
88
91
  :where(
89
92
  :root,
90
93
  .atmo,
@@ -118,38 +121,14 @@
118
121
  .pink,
119
122
  .rose
120
123
  ) {
121
- --ui-page: light-dark(var(--base-50), color-mix(in srgb, var(--base-900) 50%, var(--base-950)));
122
- --ui-recess: light-dark(
123
- color-mix(in srgb, var(--base-100) 75%, var(--base-200)),
124
- var(--base-950)
125
- );
126
- --ui-surface: light-dark(var(--base-50), var(--base-900));
127
- --ui-ink: light-dark(var(--base-950), var(--base-50));
128
- --ui-muted: light-dark(var(--base-600), var(--base-400));
129
- --ui-line: light-dark(
130
- var(--base-300),
131
- color-mix(in srgb, var(--base-800) 80%, var(--base-950))
132
- );
133
- --ui-field: light-dark(
134
- color-mix(in srgb, var(--base-100) 75%, var(--base-200)),
135
- color-mix(in srgb, var(--base-950) 80%, black)
136
- );
137
- --ui-control-line: light-dark(var(--base-300), var(--base-800));
138
- --ui-control-hover: light-dark(var(--base-400), var(--base-700));
139
- --ui-action: light-dark(var(--accent-700), var(--accent-300));
140
- --ui-accent-soft: light-dark(
141
- var(--accent-50),
142
- color-mix(in srgb, var(--accent-950) 65%, var(--base-950))
143
- );
144
- --ui-focus: light-dark(var(--accent-700), var(--accent-300));
145
- --ui-shadow: light-dark(color-mix(in srgb, var(--base-950) 8%, transparent), #0006);
146
- --ui-shadow-soft: light-dark(color-mix(in srgb, var(--base-950) 2%, transparent), #0002);
147
- --ui-recess-shadow: inset 0 2px 4px var(--ui-shadow), inset 0 5px 12px var(--ui-shadow-soft);
124
+ --base-925: color-mix(in srgb, var(--base-900) 50%, var(--base-950));
125
+ --base-975: color-mix(in srgb, var(--base-950) 80%, black);
126
+ --accent-925: color-mix(in srgb, var(--accent-900) 50%, var(--accent-950));
127
+ --accent-975: color-mix(in srgb, var(--accent-950) 80%, black);
148
128
  }
149
129
  .atmo {
150
130
  font-family: var(--atmo-font-sans);
151
- color: var(--ui-ink);
152
- background: var(--ui-page);
131
+ @apply bg-base-50 text-base-950 dark:bg-base-925 dark:text-base-50;
153
132
  -webkit-font-smoothing: antialiased;
154
133
  }
155
134
  .gray {
package/dist/theme.js CHANGED
@@ -1,10 +1,9 @@
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.
1
+ // Portals inherit the document's light/dark mode normally. Only carry scoped
2
+ // palettes and typography, which would otherwise be lost outside their ancestry.
3
3
  export function readTheme(element) {
4
4
  const style = getComputedStyle(element);
5
- const variables = Array.from(style).filter((name) => ['--base-', '--accent-', '--ui-', '--atmo-'].some((prefix) => name.startsWith(prefix)));
5
+ const variables = Array.from(style).filter((name) => ['--base-', '--accent-', '--atmo-'].some((prefix) => name.startsWith(prefix)));
6
6
  return [
7
- `color-scheme:${style.colorScheme}`,
8
7
  `font-family:${style.fontFamily}`,
9
8
  ...variables.map((name) => `${name}:${style.getPropertyValue(name)}`)
10
9
  ].join(';');
@@ -19,12 +18,5 @@ export function observeTheme(element, update) {
19
18
  });
20
19
  parent = parent.parentElement;
21
20
  }
22
- // readTheme snapshots computed semantic colors for portals. Those colors
23
- // change with the system scheme even when no ancestor attribute changes.
24
- const scheme = window.matchMedia('(prefers-color-scheme: dark)');
25
- scheme.addEventListener('change', update);
26
- return () => {
27
- observer.disconnect();
28
- scheme.removeEventListener('change', update);
29
- };
21
+ return () => observer.disconnect();
30
22
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atmo-dev/kit",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "The shared UI foundation for Atmo apps.",
5
5
  "license": "MIT",
6
6
  "repository": {
File without changes