@getcortexlabs/mavis-core 0.1.0-alpha.1 → 0.1.0-alpha.2

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/dist/vue/theme.js CHANGED
@@ -1,11 +1,46 @@
1
1
  import { inject, readonly, shallowRef } from '@vue/runtime-core';
2
2
  import { mavis } from '../theme/themes.js';
3
- export function createThemeContext(initial) {
3
+ const modes = ['system', 'light', 'dark'];
4
+ function checkMode(mode) {
5
+ if (!modes.includes(mode))
6
+ throw new RangeError(`Unknown appearance mode: ${String(mode)}`);
7
+ return mode;
8
+ }
9
+ export function createThemeContext(options = {}) {
10
+ const config = 'colors' in options ? { theme: options } : options;
11
+ const initial = config.theme ?? mavis;
12
+ const themes = { [initial.appearance]: initial };
13
+ if (config.darkTheme)
14
+ themes.dark = config.darkTheme;
15
+ const appearance = shallowRef(checkMode(config.appearance ?? 'system'));
4
16
  const theme = shallowRef(initial);
17
+ const resolve = () => {
18
+ const wanted = appearance.value === 'system'
19
+ ? (config.source?.current() ?? initial.appearance)
20
+ : appearance.value;
21
+ theme.value = themes[wanted] ?? themes[wanted === 'dark' ? 'light' : 'dark'] ?? initial;
22
+ };
23
+ resolve();
24
+ const stop = config.source?.observe(() => {
25
+ if (appearance.value === 'system')
26
+ resolve();
27
+ });
5
28
  return {
6
29
  theme: readonly(theme),
30
+ /** The selection: `system` follows the device; `light` and `dark` are explicit overrides. */
31
+ appearance: readonly(appearance),
32
+ setAppearance(mode) {
33
+ appearance.value = checkMode(mode);
34
+ resolve();
35
+ },
36
+ /** Registers the theme for its own appearance and pins that appearance. */
7
37
  setTheme(next) {
8
- theme.value = next;
38
+ themes[next.appearance] = next;
39
+ appearance.value = next.appearance;
40
+ resolve();
41
+ },
42
+ dispose() {
43
+ stop?.();
9
44
  },
10
45
  };
11
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/vue/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAG1C,MAAM,UAAU,kBAAkB,CAAC,OAAmB;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACjC,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QACtB,QAAQ,CAAC,IAAgB;YACvB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QACpB,CAAC;KACF,CAAA;AACH,CAAC;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAoC,MAAM,CAAC,aAAa,CAAC,CAAA;AAE9E,kFAAkF;AAClF,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/vue/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAmB1C,MAAM,KAAK,GAA8B,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAEpE,SAAS,SAAS,CAAC,IAAoB;IACrC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3F,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAA4C,EAAE;IAC/E,MAAM,MAAM,GAAwB,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAA;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAA;IACrC,MAAM,MAAM,GAA4C,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAA;IACzF,IAAI,MAAM,CAAC,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS,CAAA;IACpD,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAA;IACvE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACjC,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,MAAM,GACV,UAAU,CAAC,KAAK,KAAK,QAAQ;YAC3B,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC;YAClD,CAAC,CAAC,UAAU,CAAC,KAAK,CAAA;QACtB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAA;IACzF,CAAC,CAAA;IACD,OAAO,EAAE,CAAA;IACT,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE;QACvC,IAAI,UAAU,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAA;IAC9C,CAAC,CAAC,CAAA;IACF,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QACtB,6FAA6F;QAC7F,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;QAChC,aAAa,CAAC,IAAoB;YAChC,UAAU,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAClC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,2EAA2E;QAC3E,QAAQ,CAAC,IAAgB;YACvB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;YAC9B,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAA;YAClC,OAAO,EAAE,CAAA;QACX,CAAC;QACD,OAAO;YACL,IAAI,EAAE,EAAE,CAAA;QACV,CAAC;KACF,CAAA;AACH,CAAC;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAoC,MAAM,CAAC,aAAa,CAAC,CAAA;AAE9E,kFAAkF;AAClF,MAAM,UAAU,aAAa;IAC3B,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getcortexlabs/mavis-core",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.0-alpha.2",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Shared Mavis themes and component contracts.",
package/src/icon.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { icons } from './icons.js'
2
+
3
+ export type IconName = keyof typeof icons
4
+ export const iconFontFamily = 'lucide'
5
+ export const iconSizes = { sm: 16, md: 20, lg: 24 } as const
6
+ export type IconSize = keyof typeof iconSizes | number
7
+
8
+ /** The private-use character of an icon in the bundled Lucide font. */
9
+ export function iconGlyph(name: IconName): string {
10
+ const code = icons[name]
11
+ if (!code) throw new RangeError(`Unknown icon: ${String(name)}`)
12
+ return String.fromCodePoint(code)
13
+ }
14
+
15
+ /** A control that shows only an icon still needs a name for assistive technology. */
16
+ export function checkIconOnly(text: string, hasIcon: boolean, label: string | undefined) {
17
+ if (hasIcon && !text && !label) {
18
+ throw new RangeError('An icon-only button needs accessibilityLabel')
19
+ }
20
+ }
21
+
22
+ export function resolveIconSize(size: IconSize): number {
23
+ if (typeof size === 'number') {
24
+ if (!Number.isFinite(size) || size <= 0) throw new RangeError(`Invalid icon size: ${size}`)
25
+ return size
26
+ }
27
+ const value = iconSizes[size]
28
+ if (!value) throw new RangeError(`Invalid icon size: ${String(size)}`)
29
+ return value
30
+ }