@isoline-ui/react-native 0.0.0-stage → 0.1.0-alpha.3

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 (167) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE.md +12 -0
  3. package/README.md +104 -3
  4. package/dist/amount.d.ts +3 -0
  5. package/dist/calendar.d.ts +7 -0
  6. package/dist/components/action-chip.d.ts +9 -0
  7. package/dist/components/amount-field.d.ts +12 -0
  8. package/dist/components/avatar.d.ts +17 -0
  9. package/dist/components/back-button.d.ts +12 -0
  10. package/dist/components/back-icon.d.ts +3 -0
  11. package/dist/components/badge.d.ts +13 -0
  12. package/dist/components/banner.d.ts +14 -0
  13. package/dist/components/bottom-sheet-native.d.ts +11 -0
  14. package/dist/components/bottom-sheet-web.d.ts +18 -0
  15. package/dist/components/bottom-sheet.d.ts +3 -0
  16. package/dist/components/button-group.d.ts +26 -0
  17. package/dist/components/button.d.ts +48 -0
  18. package/dist/components/checkbox.d.ts +12 -0
  19. package/dist/components/color-picker.d.ts +21 -0
  20. package/dist/components/context-menu.d.ts +26 -0
  21. package/dist/components/date-picker.d.ts +64 -0
  22. package/dist/components/dialog-context.d.ts +2 -0
  23. package/dist/components/dialog.d.ts +20 -0
  24. package/dist/components/empty-state.d.ts +15 -0
  25. package/dist/components/expand-indicator.d.ts +27 -0
  26. package/dist/components/expressive-shape.d.ts +18 -0
  27. package/dist/components/fab-menu-legacy.d.ts +31 -0
  28. package/dist/components/fab-menu.d.ts +21 -0
  29. package/dist/components/filter-chip.d.ts +69 -0
  30. package/dist/components/floating-action-button.d.ts +15 -0
  31. package/dist/components/icon-button.d.ts +40 -0
  32. package/dist/components/icons.d.ts +18 -0
  33. package/dist/components/input.d.ts +9 -0
  34. package/dist/components/keyboard-inset-view.d.ts +15 -0
  35. package/dist/components/list-controls.d.ts +38 -0
  36. package/dist/components/loading-indicator.d.ts +9 -0
  37. package/dist/components/menu-sheet.d.ts +36 -0
  38. package/dist/components/panel-sheet.d.ts +8 -0
  39. package/dist/components/password-visibility.d.ts +5 -0
  40. package/dist/components/popover-layout.d.ts +25 -0
  41. package/dist/components/popover.d.ts +20 -0
  42. package/dist/components/pressable.d.ts +12 -0
  43. package/dist/components/radio-navigation.d.ts +11 -0
  44. package/dist/components/refresh-control.d.ts +16 -0
  45. package/dist/components/row-gap.d.ts +9 -0
  46. package/dist/components/search-field.d.ts +22 -0
  47. package/dist/components/select-field.d.ts +16 -0
  48. package/dist/components/settings-list.d.ts +98 -0
  49. package/dist/components/settings-row.d.ts +13 -0
  50. package/dist/components/sheet-frame.d.ts +27 -0
  51. package/dist/components/sheet-lifecycle.d.ts +36 -0
  52. package/dist/components/sheet-transition.d.ts +36 -0
  53. package/dist/components/slider.d.ts +21 -0
  54. package/dist/components/snackbar.d.ts +10 -0
  55. package/dist/components/split-button.d.ts +38 -0
  56. package/dist/components/squish.d.ts +20 -0
  57. package/dist/components/swipeable-row.d.ts +20 -0
  58. package/dist/components/switch.d.ts +8 -0
  59. package/dist/components/tab-bar.d.ts +20 -0
  60. package/dist/components/text-field.d.ts +31 -0
  61. package/dist/components/text.d.ts +9 -0
  62. package/dist/components/time-picker.d.ts +40 -0
  63. package/dist/components/toolbar.d.ts +77 -0
  64. package/dist/components/top-bar.d.ts +27 -0
  65. package/dist/components/undo-bar.d.ts +23 -0
  66. package/dist/components/wavy-progress.d.ts +21 -0
  67. package/dist/components/zoomable-image.d.ts +18 -0
  68. package/dist/expressive-shapes.d.ts +8 -0
  69. package/dist/index.d.ts +62 -0
  70. package/dist/keyboard.d.ts +2 -0
  71. package/dist/material.d.ts +11 -0
  72. package/dist/media.d.ts +11 -0
  73. package/dist/motion.d.ts +96 -0
  74. package/dist/platform.d.ts +3 -0
  75. package/dist/preset-tokens.d.ts +264 -0
  76. package/dist/provider.d.ts +59 -0
  77. package/dist/reduced-motion.d.ts +45 -0
  78. package/dist/selection.d.ts +2 -0
  79. package/dist/shape.d.ts +99 -0
  80. package/dist/sheet-physics.d.ts +37 -0
  81. package/dist/theme.d.ts +103 -0
  82. package/dist/tokens.d.ts +2 -0
  83. package/dist/use-keyboard-height.d.ts +10 -0
  84. package/dist/utils.d.ts +3 -0
  85. package/nativewind.cjs +68 -0
  86. package/package.json +63 -6
  87. package/src/amount.ts +53 -0
  88. package/src/calendar.ts +42 -0
  89. package/src/components/action-chip.tsx +64 -0
  90. package/src/components/amount-field.tsx +49 -0
  91. package/src/components/avatar.tsx +91 -0
  92. package/src/components/back-button.tsx +39 -0
  93. package/src/components/back-icon.tsx +25 -0
  94. package/src/components/badge.tsx +41 -0
  95. package/src/components/banner.tsx +63 -0
  96. package/src/components/bottom-sheet-native.tsx +52 -0
  97. package/src/components/bottom-sheet-web.tsx +193 -0
  98. package/src/components/bottom-sheet.tsx +5 -0
  99. package/src/components/button-group.tsx +326 -0
  100. package/src/components/button.tsx +337 -0
  101. package/src/components/checkbox.tsx +71 -0
  102. package/src/components/color-picker.tsx +115 -0
  103. package/src/components/context-menu.tsx +149 -0
  104. package/src/components/date-picker.tsx +466 -0
  105. package/src/components/dialog-context.ts +3 -0
  106. package/src/components/dialog.tsx +210 -0
  107. package/src/components/empty-state.tsx +49 -0
  108. package/src/components/expand-indicator.tsx +60 -0
  109. package/src/components/expressive-shape.tsx +37 -0
  110. package/src/components/fab-menu-legacy.tsx +181 -0
  111. package/src/components/fab-menu.tsx +90 -0
  112. package/src/components/filter-chip.tsx +136 -0
  113. package/src/components/floating-action-button.tsx +79 -0
  114. package/src/components/icon-button.tsx +127 -0
  115. package/src/components/icons.tsx +43 -0
  116. package/src/components/input.tsx +80 -0
  117. package/src/components/keyboard-inset-view.tsx +28 -0
  118. package/src/components/list-controls.tsx +134 -0
  119. package/src/components/loading-indicator.tsx +183 -0
  120. package/src/components/menu-sheet.tsx +133 -0
  121. package/src/components/panel-sheet.tsx +90 -0
  122. package/src/components/password-visibility.tsx +39 -0
  123. package/src/components/popover-layout.ts +47 -0
  124. package/src/components/popover.tsx +139 -0
  125. package/src/components/pressable.tsx +108 -0
  126. package/src/components/radio-navigation.ts +52 -0
  127. package/src/components/refresh-control.tsx +39 -0
  128. package/src/components/row-gap.tsx +13 -0
  129. package/src/components/search-field.tsx +92 -0
  130. package/src/components/select-field.tsx +105 -0
  131. package/src/components/settings-list.tsx +302 -0
  132. package/src/components/settings-row.tsx +61 -0
  133. package/src/components/sheet-frame.tsx +250 -0
  134. package/src/components/sheet-lifecycle.ts +233 -0
  135. package/src/components/sheet-transition.ts +105 -0
  136. package/src/components/slider.tsx +185 -0
  137. package/src/components/snackbar.tsx +97 -0
  138. package/src/components/split-button.tsx +212 -0
  139. package/src/components/squish.ts +41 -0
  140. package/src/components/swipeable-row.tsx +109 -0
  141. package/src/components/switch.tsx +77 -0
  142. package/src/components/tab-bar.tsx +195 -0
  143. package/src/components/text-field.tsx +264 -0
  144. package/src/components/text.tsx +58 -0
  145. package/src/components/time-picker.tsx +277 -0
  146. package/src/components/toolbar.tsx +406 -0
  147. package/src/components/top-bar.tsx +91 -0
  148. package/src/components/undo-bar.tsx +137 -0
  149. package/src/components/wavy-progress.tsx +150 -0
  150. package/src/components/zoomable-image.tsx +240 -0
  151. package/src/expressive-shapes.ts +25 -0
  152. package/src/index.ts +62 -0
  153. package/src/keyboard.ts +5 -0
  154. package/src/material.ts +16 -0
  155. package/src/media.ts +51 -0
  156. package/src/motion.ts +96 -0
  157. package/src/platform.ts +13 -0
  158. package/src/preset-tokens.ts +265 -0
  159. package/src/provider.tsx +201 -0
  160. package/src/reduced-motion.ts +50 -0
  161. package/src/selection.ts +11 -0
  162. package/src/shape.ts +217 -0
  163. package/src/sheet-physics.ts +73 -0
  164. package/src/theme.ts +180 -0
  165. package/src/tokens.ts +2 -0
  166. package/src/use-keyboard-height.ts +64 -0
  167. package/src/utils.ts +7 -0
package/src/index.ts ADDED
@@ -0,0 +1,62 @@
1
+ export * from './provider.tsx';
2
+ export * from './theme.ts';
3
+ export * from './tokens.ts';
4
+ export type { IconProps } from './components/icons.tsx';
5
+ export * from './components/button.tsx';
6
+ export * from './components/button-group.tsx';
7
+ export * from './components/filter-chip.tsx';
8
+ export * from './components/icon-button.tsx';
9
+ export * from './components/loading-indicator.tsx';
10
+ export * from './components/text-field.tsx';
11
+ export * from './components/wavy-progress.tsx';
12
+ export * from './components/menu-sheet.tsx';
13
+ export * from './components/select-field.tsx';
14
+ export * from './components/expressive-shape.tsx';
15
+ export * from './components/squish.ts';
16
+ export * from './components/row-gap.tsx';
17
+ export * from './components/back-icon.tsx';
18
+ export * from './components/pressable.tsx';
19
+ export * from './components/switch.tsx';
20
+ export * from './components/dialog.tsx';
21
+ export * from './components/bottom-sheet.tsx';
22
+ export * from './components/sheet-transition.ts';
23
+ export * from './components/search-field.tsx';
24
+ export * from './components/text.tsx';
25
+ export * from './components/badge.tsx';
26
+ export * from './components/expand-indicator.tsx';
27
+ export * from './components/refresh-control.tsx';
28
+ export * from './components/keyboard-inset-view.tsx';
29
+ export * from './components/back-button.tsx';
30
+ export * from './components/input.tsx';
31
+ export * from './components/toolbar.tsx';
32
+ export * from './components/split-button.tsx';
33
+ export * from './components/top-bar.tsx';
34
+ export * from './components/sheet-frame.tsx';
35
+ export * from './components/panel-sheet.tsx';
36
+ export * from './components/settings-list.tsx';
37
+ export * from './components/empty-state.tsx';
38
+ export * from './components/snackbar.tsx';
39
+ export * from './components/settings-row.tsx';
40
+ export * from './components/fab-menu.tsx';
41
+ export { usesPlatformMaterial } from './material.ts';
42
+ export * from './components/tab-bar.tsx';
43
+ export * from './components/popover.tsx';
44
+ export * from './components/context-menu.tsx';
45
+ export * from './components/floating-action-button.tsx';
46
+ export { spatial } from './motion.ts';
47
+ export { useReducedMotion } from './reduced-motion.ts';
48
+ export * from './components/checkbox.tsx';
49
+ export * from './components/avatar.tsx';
50
+ export * from './components/slider.tsx';
51
+ export * from './components/action-chip.tsx';
52
+ export * from './components/color-picker.tsx';
53
+ export * from './components/amount-field.tsx';
54
+ export * from './components/date-picker.tsx';
55
+ export * from './components/time-picker.tsx';
56
+ export * from './components/banner.tsx';
57
+ export * from './components/undo-bar.tsx';
58
+ export * from './components/list-controls.tsx';
59
+ export * from './components/swipeable-row.tsx';
60
+ export * from './components/zoomable-image.tsx';
61
+ export { parseLocalizedAmount, formatLocalizedAmount } from './amount.ts';
62
+ export { validDate, validTime, addDays, addMonths, monthDays, formatCalendarDate } from './calendar.ts';
@@ -0,0 +1,5 @@
1
+ /** Browser keyboard occlusion only while editing, at normal zoom. Resized layouts need no extra inset. */
2
+ export function keyboardOcclusion(layoutHeight: number, visualHeight: number, offsetTop = 0, scale = 1, editing = false): number {
3
+ if (!editing || Math.abs(scale - 1) > 0.01 || ![layoutHeight, visualHeight, offsetTop].every(Number.isFinite)) return 0;
4
+ return Math.max(0, layoutHeight - visualHeight - offsetTop);
5
+ }
@@ -0,0 +1,16 @@
1
+ /** Shared across core controls and the optional native material adapter. */
2
+ export interface MaterialOptions {
3
+ material?: 'auto' | 'glass' | 'solid';
4
+ glassStyle?: 'regular' | 'clear';
5
+ tintColor?: string;
6
+ fallbackColor?: string;
7
+ /** Enables material interaction, not an action handler. */
8
+ interactive?: boolean;
9
+ }
10
+ /** Surface requests are platform-aware; explicit solid always wins. */
11
+ export function usesPlatformMaterial(
12
+ platform: string,
13
+ material: MaterialOptions['material'] = 'solid',
14
+ ) {
15
+ return platform === 'ios' && material !== 'solid';
16
+ }
package/src/media.ts ADDED
@@ -0,0 +1,51 @@
1
+ export function clampZoom(value: number, maximum = 5) {
2
+ 'worklet';
3
+ return Math.max(
4
+ 1,
5
+ Math.min(
6
+ Number.isFinite(maximum) ? Math.max(1, maximum) : 5,
7
+ Number.isFinite(value) ? value : 1,
8
+ ),
9
+ );
10
+ }
11
+ /** Pan limits for a contained image, rather than the larger bounds of a cover image. */
12
+ export function imagePanBounds(width: number, height: number, aspect: number, scale: number) {
13
+ 'worklet';
14
+ const ratio = Math.max(0.001, aspect);
15
+ const shownWidth = Math.min(width, height * ratio);
16
+ const shownHeight = Math.min(height, width / ratio);
17
+ return {
18
+ x: Math.max(0, (shownWidth * scale - width) / 2),
19
+ y: Math.max(0, (shownHeight * scale - height) / 2),
20
+ };
21
+ }
22
+ /** RN uses source dimensions; React Native Web forwards the DOM image load event. */
23
+ export function imageDimensions(event: unknown): { width: number; height: number } | null {
24
+ if (!event || typeof event !== 'object') return null;
25
+ const data = event as {
26
+ target?: { naturalWidth?: number; naturalHeight?: number };
27
+ currentTarget?: { naturalWidth?: number; naturalHeight?: number };
28
+ nativeEvent?: {
29
+ source?: { width?: number; height?: number };
30
+ target?: { naturalWidth?: number; naturalHeight?: number };
31
+ };
32
+ };
33
+ const width =
34
+ data.nativeEvent?.source?.width ??
35
+ data.nativeEvent?.target?.naturalWidth ??
36
+ data.target?.naturalWidth ??
37
+ data.currentTarget?.naturalWidth;
38
+ const height =
39
+ data.nativeEvent?.source?.height ??
40
+ data.nativeEvent?.target?.naturalHeight ??
41
+ data.target?.naturalHeight ??
42
+ data.currentTarget?.naturalHeight;
43
+ return typeof width === 'number' &&
44
+ typeof height === 'number' &&
45
+ Number.isFinite(width) &&
46
+ Number.isFinite(height) &&
47
+ width > 0 &&
48
+ height > 0
49
+ ? { width, height }
50
+ : null;
51
+ }
package/src/motion.ts ADDED
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Material 3 Expressive motion physics.
3
+ *
4
+ * Expressive replaced M3's duration-and-easing curves with springs. A spring
5
+ * has no fixed duration: it is described by how hard it pulls (stiffness) and
6
+ * how quickly it stops wobbling (damping ratio), and it re-targets mid-flight
7
+ * instead of restarting. That is what makes an interrupted gesture feel like
8
+ * an object being redirected rather than an animation being cancelled.
9
+ *
10
+ * Two families, and they are not interchangeable:
11
+ *
12
+ * - **Spatial** springs move things — position, size, shape, rotation. They
13
+ * are under-damped (ratio < 1) so they overshoot slightly and settle back.
14
+ * - **Effects** springs change appearance — color, opacity, elevation. They
15
+ * are critically damped (ratio = 1), because a colour that overshoots reads
16
+ * as a flicker, not as weight.
17
+ *
18
+ * The values below are the *expressive* motion scheme. The standard scheme is
19
+ * stiffer and flatter; expressive trades a few milliseconds of settle time for
20
+ * motion you can actually feel. This app uses it everywhere.
21
+ */
22
+
23
+ export interface SpringToken {
24
+ /** 1 = critically damped (no overshoot); below 1 overshoots and settles. */
25
+ dampingRatio: number;
26
+ stiffness: number;
27
+ }
28
+
29
+ /** Movement: bounds, offset, scale, shape. Slightly under-damped. */
30
+ export const spatialTokens = {
31
+ fast: { dampingRatio: 0.6, stiffness: 800 },
32
+ default: { dampingRatio: 0.8, stiffness: 380 },
33
+ slow: { dampingRatio: 0.8, stiffness: 200 },
34
+ } as const satisfies Record<string, SpringToken>;
35
+
36
+ /** Appearance: color, opacity, elevation. Critically damped. */
37
+ export const effectsTokens = {
38
+ fast: { dampingRatio: 1, stiffness: 3800 },
39
+ default: { dampingRatio: 1, stiffness: 1600 },
40
+ slow: { dampingRatio: 1, stiffness: 800 },
41
+ } as const satisfies Record<string, SpringToken>;
42
+
43
+ export interface SpringConfig {
44
+ mass: number;
45
+ stiffness: number;
46
+ damping: number;
47
+ }
48
+
49
+ /**
50
+ * Converts an M3 spring token to the physical constants Reanimated wants.
51
+ *
52
+ * M3 specifies a damping *ratio* — dimensionless, and therefore stable across
53
+ * stiffness changes — while Reanimated's physics springs take an absolute
54
+ * damping coefficient. The two are related by `c = 2ζ√(km)`, so a token can be
55
+ * retuned by stiffness alone without accidentally changing its bounciness.
56
+ */
57
+ export function springConfig(token: SpringToken, mass = 1): SpringConfig {
58
+ 'worklet';
59
+ return {
60
+ mass,
61
+ stiffness: token.stiffness,
62
+ damping: token.dampingRatio * 2 * Math.sqrt(token.stiffness * mass),
63
+ };
64
+ }
65
+
66
+ /** Ready-made configs, so call sites read as `spatial.fast` not as numbers. */
67
+ export const spatial = {
68
+ fast: springConfig(spatialTokens.fast),
69
+ default: springConfig(spatialTokens.default),
70
+ slow: springConfig(spatialTokens.slow),
71
+ } as const;
72
+
73
+ export const effects = {
74
+ fast: springConfig(effectsTokens.fast),
75
+ default: springConfig(effectsTokens.default),
76
+ slow: springConfig(effectsTokens.slow),
77
+ } as const;
78
+
79
+ /**
80
+ * Stagger between items in a group that animates in together (FAB menu items,
81
+ * toolbar contents). Expressive sequences items rather than moving them as one
82
+ * block — the offset is what makes a menu feel unfolded instead of pasted on.
83
+ */
84
+ export const STAGGER_MS = 28;
85
+
86
+ /**
87
+ * The stagger to actually use, given the reader's motion preference.
88
+ *
89
+ * Collapses to zero under "Remove animations": a sequence unfolding is the
90
+ * effect itself, and with nothing moving, a delay is only a row arriving late
91
+ * for no visible reason. Here rather than in `~/lib/reduced-motion` so it
92
+ * stays free of Reanimated and testable under `node --test`.
93
+ */
94
+ export function staggerFor(reduced: boolean, stagger: number = STAGGER_MS): number {
95
+ return reduced ? 0 : stagger;
96
+ }
@@ -0,0 +1,13 @@
1
+ export type IsolinePlatform = 'ios' | 'android';
2
+ /** Native follows the OS. Web can preview either design without spoofing Platform.OS. */
3
+ export function resolvePlatform(
4
+ os: string,
5
+ requested?: IsolinePlatform,
6
+ inherited?: IsolinePlatform,
7
+ ): IsolinePlatform {
8
+ return os === 'ios'
9
+ ? 'ios'
10
+ : os === 'android'
11
+ ? 'android'
12
+ : (requested ?? inherited ?? 'android');
13
+ }
@@ -0,0 +1,265 @@
1
+ /* Generic theme role values; no fonts or artwork are bundled. */
2
+ export const presetTokens = {
3
+ violet: {
4
+ light: {
5
+ '--background': '268 30% 99%',
6
+ '--foreground': '268 10% 11%',
7
+ '--surface': '268 30% 99%',
8
+ '--surface-variant': '268 15% 91%',
9
+ '--on-surface': '268 10% 11%',
10
+ '--on-surface-variant': '268 8% 32%',
11
+ '--surface-container-lowest': '0 0% 100%',
12
+ '--surface-container-low': '268 30% 97%',
13
+ '--surface-container': '268 24% 95%',
14
+ '--surface-container-high': '268 20% 92%',
15
+ '--surface-container-highest': '268 18% 90%',
16
+ '--card': '268 30% 97%',
17
+ '--card-foreground': '268 10% 11%',
18
+ '--popover': '268 20% 93%',
19
+ '--popover-foreground': '268 10% 11%',
20
+ '--primary': '268 48% 46%',
21
+ '--primary-foreground': '0 0% 100%',
22
+ '--primary-container': '268 80% 92%',
23
+ '--on-primary-container': '268 60% 18%',
24
+ '--secondary-container': '268 30% 89%',
25
+ '--on-secondary-container': '268 25% 14%',
26
+ '--tertiary': '22 75% 42%',
27
+ '--on-tertiary': '0 0% 100%',
28
+ '--tertiary-container': '22 95% 90%',
29
+ '--on-tertiary-container': '22 70% 15%',
30
+ '--destructive': '5 75% 45%',
31
+ '--destructive-foreground': '0 0% 100%',
32
+ '--error-container': '5 90% 92%',
33
+ '--on-error-container': '5 60% 20%',
34
+ '--muted': '268 15% 91%',
35
+ '--muted-foreground': '268 8% 32%',
36
+ '--accent': '268 35% 90%',
37
+ '--accent-foreground': '268 60% 18%',
38
+ '--outline': '268 6% 48%',
39
+ '--outline-variant': '268 12% 82%',
40
+ '--border': '268 12% 84%',
41
+ '--input': '268 6% 55%',
42
+ '--ring': '268 48% 46%',
43
+ '--inverse-surface': '268 10% 18%',
44
+ '--inverse-on-surface': '268 20% 96%',
45
+ '--inverse-primary': '268 80% 82%',
46
+ '--success': '145 55% 32%',
47
+ },
48
+ dark: {
49
+ '--background': '268 10% 11%',
50
+ '--foreground': '268 12% 92%',
51
+ '--surface': '268 10% 11%',
52
+ '--surface-variant': '268 10% 25%',
53
+ '--on-surface': '268 12% 92%',
54
+ '--on-surface-variant': '268 10% 78%',
55
+ '--surface-container-lowest': '268 12% 6%',
56
+ '--surface-container-low': '268 10% 8%',
57
+ '--surface-container': '268 10% 13%',
58
+ '--surface-container-high': '268 10% 17%',
59
+ '--surface-container-highest': '268 10% 22%',
60
+ '--card': '268 10% 13%',
61
+ '--card-foreground': '268 12% 92%',
62
+ '--popover': '268 10% 17%',
63
+ '--popover-foreground': '268 12% 92%',
64
+ '--primary': '268 75% 82%',
65
+ '--primary-foreground': '268 45% 22%',
66
+ '--primary-container': '268 35% 32%',
67
+ '--on-primary-container': '268 80% 92%',
68
+ '--secondary-container': '268 18% 28%',
69
+ '--on-secondary-container': '268 30% 89%',
70
+ '--tertiary': '22 90% 75%',
71
+ '--on-tertiary': '22 70% 18%',
72
+ '--tertiary-container': '22 55% 30%',
73
+ '--on-tertiary-container': '22 95% 90%',
74
+ '--destructive': '5 80% 75%',
75
+ '--destructive-foreground': '5 55% 22%',
76
+ '--error-container': '5 55% 32%',
77
+ '--on-error-container': '5 90% 92%',
78
+ '--muted': '268 10% 25%',
79
+ '--muted-foreground': '268 10% 78%',
80
+ '--accent': '268 12% 22%',
81
+ '--accent-foreground': '268 60% 90%',
82
+ '--outline': '268 6% 54%',
83
+ '--outline-variant': '268 8% 30%',
84
+ '--border': '268 8% 22%',
85
+ '--input': '268 6% 44%',
86
+ '--ring': '268 75% 82%',
87
+ '--inverse-surface': '268 12% 92%',
88
+ '--inverse-on-surface': '268 10% 16%',
89
+ '--inverse-primary': '268 48% 46%',
90
+ '--success': '145 45% 65%',
91
+ },
92
+ },
93
+ teal: {
94
+ light: {
95
+ '--background': '173 15% 99%',
96
+ '--foreground': '173 8% 10%',
97
+ '--surface': '173 15% 99%',
98
+ '--surface-variant': '173 12% 91%',
99
+ '--on-surface': '173 8% 10%',
100
+ '--on-surface-variant': '173 6% 32%',
101
+ '--surface-container-lowest': '0 0% 100%',
102
+ '--surface-container-low': '173 20% 97%',
103
+ '--surface-container': '173 18% 95%',
104
+ '--surface-container-high': '173 16% 92%',
105
+ '--surface-container-highest': '173 14% 90%',
106
+ '--card': '173 20% 97%',
107
+ '--card-foreground': '173 8% 10%',
108
+ '--popover': '173 16% 92%',
109
+ '--popover-foreground': '173 8% 10%',
110
+ '--primary': '173 60% 28%',
111
+ '--primary-foreground': '0 0% 100%',
112
+ '--primary-container': '173 55% 88%',
113
+ '--on-primary-container': '173 70% 10%',
114
+ '--secondary-container': '173 25% 88%',
115
+ '--on-secondary-container': '173 25% 12%',
116
+ '--tertiary': '243 45% 48%',
117
+ '--on-tertiary': '0 0% 100%',
118
+ '--tertiary-container': '243 65% 91%',
119
+ '--on-tertiary-container': '243 50% 16%',
120
+ '--destructive': '5 75% 45%',
121
+ '--destructive-foreground': '0 0% 100%',
122
+ '--error-container': '5 90% 92%',
123
+ '--on-error-container': '5 60% 20%',
124
+ '--muted': '173 12% 91%',
125
+ '--muted-foreground': '173 6% 32%',
126
+ '--accent': '173 30% 89%',
127
+ '--accent-foreground': '173 70% 12%',
128
+ '--outline': '173 6% 48%',
129
+ '--outline-variant': '173 10% 82%',
130
+ '--border': '173 10% 82%',
131
+ '--input': '173 6% 55%',
132
+ '--ring': '173 60% 28%',
133
+ '--inverse-surface': '173 10% 18%',
134
+ '--inverse-on-surface': '173 15% 96%',
135
+ '--inverse-primary': '173 55% 78%',
136
+ '--archive': '152 65% 30%',
137
+ '--snooze': '38 90% 38%',
138
+ },
139
+ dark: {
140
+ '--background': '173 10% 11%',
141
+ '--foreground': '173 10% 92%',
142
+ '--surface': '173 10% 11%',
143
+ '--surface-variant': '173 10% 24%',
144
+ '--on-surface': '173 10% 92%',
145
+ '--on-surface-variant': '173 8% 76%',
146
+ '--surface-container-lowest': '173 12% 6%',
147
+ '--surface-container-low': '173 10% 8%',
148
+ '--surface-container': '173 10% 13%',
149
+ '--surface-container-high': '173 10% 17%',
150
+ '--surface-container-highest': '173 10% 22%',
151
+ '--card': '173 10% 13%',
152
+ '--card-foreground': '173 10% 92%',
153
+ '--popover': '173 10% 17%',
154
+ '--popover-foreground': '173 10% 92%',
155
+ '--primary': '173 50% 72%',
156
+ '--primary-foreground': '173 65% 14%',
157
+ '--primary-container': '173 55% 24%',
158
+ '--on-primary-container': '173 55% 88%',
159
+ '--secondary-container': '173 20% 28%',
160
+ '--on-secondary-container': '173 25% 88%',
161
+ '--tertiary': '243 65% 82%',
162
+ '--on-tertiary': '243 45% 20%',
163
+ '--tertiary-container': '243 45% 32%',
164
+ '--on-tertiary-container': '243 65% 91%',
165
+ '--destructive': '5 80% 75%',
166
+ '--destructive-foreground': '5 55% 22%',
167
+ '--error-container': '5 55% 32%',
168
+ '--on-error-container': '5 90% 92%',
169
+ '--muted': '173 10% 24%',
170
+ '--muted-foreground': '173 8% 76%',
171
+ '--accent': '173 12% 22%',
172
+ '--accent-foreground': '173 45% 88%',
173
+ '--outline': '173 6% 52%',
174
+ '--outline-variant': '173 8% 30%',
175
+ '--border': '173 8% 22%',
176
+ '--input': '173 6% 44%',
177
+ '--ring': '173 50% 72%',
178
+ '--inverse-surface': '173 10% 92%',
179
+ '--inverse-on-surface': '173 10% 16%',
180
+ '--inverse-primary': '173 60% 30%',
181
+ '--archive': '152 55% 55%',
182
+ '--snooze': '38 95% 62%',
183
+ },
184
+ },
185
+ cyan: {
186
+ light: {
187
+ '--background': '210 33% 97%',
188
+ '--foreground': '216 30% 10%',
189
+ '--surface': '210 33% 97%',
190
+ '--surface-variant': '210 20% 86%',
191
+ '--on-surface': '216 30% 10%',
192
+ '--on-surface-variant': '214 14% 34%',
193
+ '--surface-container-lowest': '0 0% 100%',
194
+ '--surface-container-low': '210 30% 94%',
195
+ '--surface-container': '210 27% 91%',
196
+ '--surface-container-high': '210 24% 88%',
197
+ '--surface-container-highest': '210 22% 85%',
198
+ '--popover': '210 30% 94%',
199
+ '--popover-foreground': '216 30% 10%',
200
+ '--primary': '192 92% 30%',
201
+ '--primary-foreground': '0 0% 100%',
202
+ '--primary-container': '188 75% 87%',
203
+ '--on-primary-container': '195 90% 13%',
204
+ '--secondary-container': '212 40% 87%',
205
+ '--on-secondary-container': '214 40% 15%',
206
+ '--tertiary': '22 90% 40%',
207
+ '--on-tertiary': '0 0% 100%',
208
+ '--tertiary-container': '28 100% 89%',
209
+ '--on-tertiary-container': '18 80% 17%',
210
+ '--destructive': '4 72% 46%',
211
+ '--destructive-foreground': '0 0% 100%',
212
+ '--error-container': '4 90% 92%',
213
+ '--on-error-container': '4 60% 20%',
214
+ '--muted': '210 20% 86%',
215
+ '--muted-foreground': '214 14% 34%',
216
+ '--outline': '213 10% 48%',
217
+ '--outline-variant': '212 18% 76%',
218
+ '--border': '212 20% 80%',
219
+ '--inverse-surface': '216 25% 14%',
220
+ '--inverse-on-surface': '210 30% 94%',
221
+ '--inverse-primary': '187 85% 60%',
222
+ '--success': '150 60% 30%',
223
+ '--warning': '36 90% 32%',
224
+ },
225
+ dark: {
226
+ '--background': '216 29% 6%',
227
+ '--foreground': '210 30% 93%',
228
+ '--surface': '216 29% 6%',
229
+ '--surface-variant': '214 18% 24%',
230
+ '--on-surface': '210 30% 93%',
231
+ '--on-surface-variant': '213 16% 70%',
232
+ '--surface-container-lowest': '216 30% 4%',
233
+ '--surface-container-low': '216 25% 10%',
234
+ '--surface-container': '215 24% 13%',
235
+ '--surface-container-high': '215 22% 17%',
236
+ '--surface-container-highest': '214 20% 21%',
237
+ '--popover': '215 24% 15%',
238
+ '--popover-foreground': '210 30% 93%',
239
+ '--primary': '187 85% 55%',
240
+ '--primary-foreground': '192 90% 9%',
241
+ '--primary-container': '191 60% 17%',
242
+ '--on-primary-container': '186 90% 85%',
243
+ '--secondary-container': '214 30% 19%',
244
+ '--on-secondary-container': '210 50% 88%',
245
+ '--tertiary': '25 95% 58%',
246
+ '--on-tertiary': '20 90% 10%',
247
+ '--tertiary-container': '22 55% 21%',
248
+ '--on-tertiary-container': '30 100% 86%',
249
+ '--destructive': '4 85% 70%',
250
+ '--destructive-foreground': '4 60% 15%',
251
+ '--error-container': '4 50% 25%',
252
+ '--on-error-container': '4 90% 90%',
253
+ '--muted': '214 18% 24%',
254
+ '--muted-foreground': '213 16% 70%',
255
+ '--outline': '213 12% 45%',
256
+ '--outline-variant': '214 16% 26%',
257
+ '--border': '214 18% 20%',
258
+ '--inverse-surface': '210 30% 93%',
259
+ '--inverse-on-surface': '216 25% 12%',
260
+ '--inverse-primary': '192 92% 30%',
261
+ '--success': '150 55% 60%',
262
+ '--warning': '42 95% 60%',
263
+ },
264
+ },
265
+ } as const;