@ankhorage/zora 2.9.3 → 2.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3c1f70f: Add a reusable `ThemeModeToggle` that switches the canonical ZORA light/dark runtime mode with accessible sun/moon affordances.
8
+
3
9
  ## 2.9.3
4
10
 
5
11
  ### Patch Changes
@@ -0,0 +1,3 @@
1
+ import type { ThemeModeToggleProps } from './ThemeModeToggleProps';
2
+ export declare function ThemeModeToggle({ disabled, size, testID }: ThemeModeToggleProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=ThemeModeToggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeModeToggle.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeModeToggle.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAGnE,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAU,EAAE,MAAM,EAAE,EAAE,oBAAoB,+BAgBrF"}
@@ -0,0 +1,9 @@
1
+ import { IconButton } from '../components/icon-button';
2
+ import { resolveThemeModeToggleState } from './resolveThemeModeToggleState';
3
+ import { useZoraTheme } from './useZoraTheme';
4
+ export function ThemeModeToggle({ disabled, size = 'm', testID }) {
5
+ const { mode, setMode } = useZoraTheme();
6
+ const state = resolveThemeModeToggleState(mode);
7
+ return (<IconButton color="neutral" disabled={disabled} icon={{ name: state.iconName }} label={state.label} onPress={() => setMode(state.nextMode)} size={size} testID={testID} variant="ghost"/>);
8
+ }
9
+ //# sourceMappingURL=ThemeModeToggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeModeToggle.js","sourceRoot":"","sources":["../../src/theme/ThemeModeToggle.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,GAAG,EAAE,MAAM,EAAwB;IACpF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,CAAC;IAEhD,OAAO,CACL,CAAC,UAAU,CACT,KAAK,CAAC,SAAS,CACf,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAC/B,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CACnB,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CACvC,IAAI,CAAC,CAAC,IAAI,CAAC,CACX,MAAM,CAAC,CAAC,MAAM,CAAC,CACf,OAAO,CAAC,OAAO,EACf,CACH,CAAC;AACJ,CAAC","sourcesContent":["import { IconButton } from '../components/icon-button';\nimport { resolveThemeModeToggleState } from './resolveThemeModeToggleState';\nimport type { ThemeModeToggleProps } from './ThemeModeToggleProps';\nimport { useZoraTheme } from './useZoraTheme';\n\nexport function ThemeModeToggle({ disabled, size = 'm', testID }: ThemeModeToggleProps) {\n const { mode, setMode } = useZoraTheme();\n const state = resolveThemeModeToggleState(mode);\n\n return (\n <IconButton\n color=\"neutral\"\n disabled={disabled}\n icon={{ name: state.iconName }}\n label={state.label}\n onPress={() => setMode(state.nextMode)}\n size={size}\n testID={testID}\n variant=\"ghost\"\n />\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { IconButtonProps } from '../components/icon-button';
2
+ export type ThemeModeToggleProps = Pick<IconButtonProps, 'disabled' | 'size' | 'testID'>;
3
+ //# sourceMappingURL=ThemeModeToggleProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeModeToggleProps.d.ts","sourceRoot":"","sources":["../../src/theme/ThemeModeToggleProps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ThemeModeToggleProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeModeToggleProps.js","sourceRoot":"","sources":["../../src/theme/ThemeModeToggleProps.ts"],"names":[],"mappings":"","sourcesContent":["import type { IconButtonProps } from '../components/icon-button';\n\nexport type ThemeModeToggleProps = Pick<IconButtonProps, 'disabled' | 'size' | 'testID'>;\n"]}
@@ -1,4 +1,6 @@
1
1
  export { createZoraThemeConfig } from './createZoraThemeConfig';
2
+ export { ThemeModeToggle } from './ThemeModeToggle';
3
+ export type { ThemeModeToggleProps } from './ThemeModeToggleProps';
2
4
  export type { ZoraComputedTheme, ZoraComputedThemeMode, ZoraTheme, ZoraThemeId, ZoraThemeMode, } from './types';
3
5
  export { useZoraTheme } from './useZoraTheme';
4
6
  export { withZoraThemeScope } from './withZoraThemeScope';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { createZoraThemeConfig } from './createZoraThemeConfig';
2
+ export { ThemeModeToggle } from './ThemeModeToggle';
2
3
  export { useZoraTheme } from './useZoraTheme';
3
4
  export { withZoraThemeScope } from './withZoraThemeScope';
4
5
  export { zoraDefaultTheme } from './zoraDefaultTheme';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { createZoraThemeConfig } from './createZoraThemeConfig';\nexport type {\n ZoraComputedTheme,\n ZoraComputedThemeMode,\n ZoraTheme,\n ZoraThemeId,\n ZoraThemeMode,\n} from './types';\nexport { useZoraTheme } from './useZoraTheme';\nexport { withZoraThemeScope } from './withZoraThemeScope';\nexport type { ZoraBaseProps } from './ZoraBaseProps';\nexport { zoraDefaultTheme } from './zoraDefaultTheme';\nexport type { ZoraProviderProps } from './ZoraProvider';\nexport { ZoraProvider } from './ZoraProvider';\nexport type { ZoraThemeScopeProps } from './ZoraThemeScope';\nexport { ZoraThemeScope } from './ZoraThemeScope';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AASpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { createZoraThemeConfig } from './createZoraThemeConfig';\nexport { ThemeModeToggle } from './ThemeModeToggle';\nexport type { ThemeModeToggleProps } from './ThemeModeToggleProps';\nexport type {\n ZoraComputedTheme,\n ZoraComputedThemeMode,\n ZoraTheme,\n ZoraThemeId,\n ZoraThemeMode,\n} from './types';\nexport { useZoraTheme } from './useZoraTheme';\nexport { withZoraThemeScope } from './withZoraThemeScope';\nexport type { ZoraBaseProps } from './ZoraBaseProps';\nexport { zoraDefaultTheme } from './zoraDefaultTheme';\nexport type { ZoraProviderProps } from './ZoraProvider';\nexport { ZoraProvider } from './ZoraProvider';\nexport type { ZoraThemeScopeProps } from './ZoraThemeScope';\nexport { ZoraThemeScope } from './ZoraThemeScope';\n"]}
@@ -0,0 +1,9 @@
1
+ import type { ZoraThemeMode } from './types';
2
+ interface ThemeModeToggleState {
3
+ readonly iconName: 'moon-outline' | 'sunny-outline';
4
+ readonly label: 'Use dark mode' | 'Use light mode';
5
+ readonly nextMode: ZoraThemeMode;
6
+ }
7
+ export declare function resolveThemeModeToggleState(mode: ZoraThemeMode): ThemeModeToggleState;
8
+ export {};
9
+ //# sourceMappingURL=resolveThemeModeToggleState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveThemeModeToggleState.d.ts","sourceRoot":"","sources":["../../src/theme/resolveThemeModeToggleState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,aAAa,GAAG,oBAAoB,CAYrF"}
@@ -0,0 +1,14 @@
1
+ export function resolveThemeModeToggleState(mode) {
2
+ return mode === 'dark'
3
+ ? {
4
+ iconName: 'sunny-outline',
5
+ label: 'Use light mode',
6
+ nextMode: 'light',
7
+ }
8
+ : {
9
+ iconName: 'moon-outline',
10
+ label: 'Use dark mode',
11
+ nextMode: 'dark',
12
+ };
13
+ }
14
+ //# sourceMappingURL=resolveThemeModeToggleState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveThemeModeToggleState.js","sourceRoot":"","sources":["../../src/theme/resolveThemeModeToggleState.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,2BAA2B,CAAC,IAAmB;IAC7D,OAAO,IAAI,KAAK,MAAM;QACpB,CAAC,CAAC;YACE,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,gBAAgB;YACvB,QAAQ,EAAE,OAAO;SAClB;QACH,CAAC,CAAC;YACE,QAAQ,EAAE,cAAc;YACxB,KAAK,EAAE,eAAe;YACtB,QAAQ,EAAE,MAAM;SACjB,CAAC;AACR,CAAC","sourcesContent":["import type { ZoraThemeMode } from './types';\n\ninterface ThemeModeToggleState {\n readonly iconName: 'moon-outline' | 'sunny-outline';\n readonly label: 'Use dark mode' | 'Use light mode';\n readonly nextMode: ZoraThemeMode;\n}\n\nexport function resolveThemeModeToggleState(mode: ZoraThemeMode): ThemeModeToggleState {\n return mode === 'dark'\n ? {\n iconName: 'sunny-outline',\n label: 'Use light mode',\n nextMode: 'light',\n }\n : {\n iconName: 'moon-outline',\n label: 'Use dark mode',\n nextMode: 'dark',\n };\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ankhorage/zora",
3
3
  "type": "module",
4
- "version": "2.9.3",
4
+ "version": "2.10.0",
5
5
  "description": "Opinionated React Native and React Native Web UI kit built on @ankhorage/surface.",
6
6
  "homepage": "https://github.com/ankhorage/zora#readme",
7
7
  "bugs": {
@@ -0,0 +1,22 @@
1
+ import { IconButton } from '../components/icon-button';
2
+ import { resolveThemeModeToggleState } from './resolveThemeModeToggleState';
3
+ import type { ThemeModeToggleProps } from './ThemeModeToggleProps';
4
+ import { useZoraTheme } from './useZoraTheme';
5
+
6
+ export function ThemeModeToggle({ disabled, size = 'm', testID }: ThemeModeToggleProps) {
7
+ const { mode, setMode } = useZoraTheme();
8
+ const state = resolveThemeModeToggleState(mode);
9
+
10
+ return (
11
+ <IconButton
12
+ color="neutral"
13
+ disabled={disabled}
14
+ icon={{ name: state.iconName }}
15
+ label={state.label}
16
+ onPress={() => setMode(state.nextMode)}
17
+ size={size}
18
+ testID={testID}
19
+ variant="ghost"
20
+ />
21
+ );
22
+ }
@@ -0,0 +1,3 @@
1
+ import type { IconButtonProps } from '../components/icon-button';
2
+
3
+ export type ThemeModeToggleProps = Pick<IconButtonProps, 'disabled' | 'size' | 'testID'>;
@@ -1,4 +1,6 @@
1
1
  export { createZoraThemeConfig } from './createZoraThemeConfig';
2
+ export { ThemeModeToggle } from './ThemeModeToggle';
3
+ export type { ThemeModeToggleProps } from './ThemeModeToggleProps';
2
4
  export type {
3
5
  ZoraComputedTheme,
4
6
  ZoraComputedThemeMode,
@@ -0,0 +1,21 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+
3
+ import { resolveThemeModeToggleState } from './resolveThemeModeToggleState';
4
+
5
+ describe('resolveThemeModeToggleState', () => {
6
+ test('offers dark mode while light mode is active', () => {
7
+ expect(resolveThemeModeToggleState('light')).toEqual({
8
+ iconName: 'moon-outline',
9
+ label: 'Use dark mode',
10
+ nextMode: 'dark',
11
+ });
12
+ });
13
+
14
+ test('offers light mode while dark mode is active', () => {
15
+ expect(resolveThemeModeToggleState('dark')).toEqual({
16
+ iconName: 'sunny-outline',
17
+ label: 'Use light mode',
18
+ nextMode: 'light',
19
+ });
20
+ });
21
+ });
@@ -0,0 +1,21 @@
1
+ import type { ZoraThemeMode } from './types';
2
+
3
+ interface ThemeModeToggleState {
4
+ readonly iconName: 'moon-outline' | 'sunny-outline';
5
+ readonly label: 'Use dark mode' | 'Use light mode';
6
+ readonly nextMode: ZoraThemeMode;
7
+ }
8
+
9
+ export function resolveThemeModeToggleState(mode: ZoraThemeMode): ThemeModeToggleState {
10
+ return mode === 'dark'
11
+ ? {
12
+ iconName: 'sunny-outline',
13
+ label: 'Use light mode',
14
+ nextMode: 'light',
15
+ }
16
+ : {
17
+ iconName: 'moon-outline',
18
+ label: 'Use dark mode',
19
+ nextMode: 'dark',
20
+ };
21
+ }