Compare commits

..

1 Commits

Author SHA1 Message Date
Yaël Perret
6a060418b4 feat : Librairie de base 2026-08-31 19:17:46 +02:00
18 changed files with 2157 additions and 51 deletions

View File

@@ -21,6 +21,7 @@
"package": "com.anonymous.bahla_front" "package": "com.anonymous.bahla_front"
}, },
"web": { "web": {
"bundler": "metro",
"output": "static", "output": "static",
"favicon": "./assets/images/favicon.png" "favicon": "./assets/images/favicon.png"
}, },
@@ -35,7 +36,9 @@
"imageWidth": 76 "imageWidth": 76
} }
} }
] ],
"expo-image",
"expo-font"
], ],
"experiments": { "experiments": {
"typedRoutes": true, "typedRoutes": true,

9
babel.config.js Normal file
View File

@@ -0,0 +1,9 @@
module.exports = function (api) {
api.cache(true);
return {
presets: [
["babel-preset-expo", { jsxImportSource: "nativewind" }],
"nativewind/babel",
],
};
};

8
metro.config.js Normal file
View File

@@ -0,0 +1,8 @@
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require('expo/metro-config');
const { withNativeWind } = require('nativewind/metro');
/** @type {import('expo/metro-config').MetroConfig} */
const config = getDefaultConfig(__dirname);
module.exports = withNativeWind(config, { input: './src/global.css' })

1
nativewind-env.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
/// <reference types="nativewind/types" />

608
output.css Normal file
View File

@@ -0,0 +1,608 @@
*, ::before, ::after {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
}
::backdrop {
--tw-border-spacing-x: 0;
--tw-border-spacing-y: 0;
--tw-translate-x: 0;
--tw-translate-y: 0;
--tw-rotate: 0;
--tw-skew-x: 0;
--tw-skew-y: 0;
--tw-scale-x: 1;
--tw-scale-y: 1;
--tw-pan-x: ;
--tw-pan-y: ;
--tw-pinch-zoom: ;
--tw-scroll-snap-strictness: proximity;
--tw-gradient-from-position: ;
--tw-gradient-via-position: ;
--tw-gradient-to-position: ;
--tw-ordinal: ;
--tw-slashed-zero: ;
--tw-numeric-figure: ;
--tw-numeric-spacing: ;
--tw-numeric-fraction: ;
--tw-ring-inset: ;
--tw-ring-offset-width: 0px;
--tw-ring-offset-color: #fff;
--tw-ring-color: rgb(59 130 246 / 0.5);
--tw-ring-offset-shadow: 0 0 #0000;
--tw-ring-shadow: 0 0 #0000;
--tw-shadow: 0 0 #0000;
--tw-shadow-colored: 0 0 #0000;
--tw-blur: ;
--tw-brightness: ;
--tw-contrast: ;
--tw-grayscale: ;
--tw-hue-rotate: ;
--tw-invert: ;
--tw-saturate: ;
--tw-sepia: ;
--tw-drop-shadow: ;
--tw-backdrop-blur: ;
--tw-backdrop-brightness: ;
--tw-backdrop-contrast: ;
--tw-backdrop-grayscale: ;
--tw-backdrop-hue-rotate: ;
--tw-backdrop-invert: ;
--tw-backdrop-opacity: ;
--tw-backdrop-saturate: ;
--tw-backdrop-sepia: ;
--tw-contain-size: ;
--tw-contain-layout: ;
--tw-contain-paint: ;
--tw-contain-style: ;
}
/*
! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
*/
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
*,
::before,
::after {
box-sizing: border-box;
/* 1 */
border-width: 0;
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
/* 2 */
}
::before,
::after {
--tw-content: '';
}
/*
1. Use a consistent sensible line-height in all browsers.
2. Prevent adjustments of font size after orientation changes in iOS.
3. Use a more readable tab size.
4. Use the user's configured `sans` font-family by default.
5. Use the user's configured `sans` font-feature-settings by default.
6. Use the user's configured `sans` font-variation-settings by default.
7. Disable tap highlights on iOS
*/
html,
:host {
line-height: 1.5;
/* 1 */
-webkit-text-size-adjust: 100%;
/* 2 */
-moz-tab-size: 4;
/* 3 */
-o-tab-size: 4;
tab-size: 4;
/* 3 */
font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
/* 4 */
font-feature-settings: normal;
/* 5 */
font-variation-settings: normal;
/* 6 */
-webkit-tap-highlight-color: transparent;
/* 7 */
}
/*
1. Remove the margin in all browsers.
2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
*/
body {
margin: 0;
/* 1 */
line-height: inherit;
/* 2 */
}
/*
1. Add the correct height in Firefox.
2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
3. Ensure horizontal rules are visible by default.
*/
hr {
height: 0;
/* 1 */
color: inherit;
/* 2 */
border-top-width: 1px;
/* 3 */
}
/*
Add the correct text decoration in Chrome, Edge, and Safari.
*/
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
/*
Remove the default font size and weight for headings.
*/
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/*
Reset links to optimize for opt-in styling instead of opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/*
Add the correct font weight in Edge and Safari.
*/
b,
strong {
font-weight: bolder;
}
/*
1. Use the user's configured `mono` font-family by default.
2. Use the user's configured `mono` font-feature-settings by default.
3. Use the user's configured `mono` font-variation-settings by default.
4. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp,
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
/* 1 */
font-feature-settings: normal;
/* 2 */
font-variation-settings: normal;
/* 3 */
font-size: 1em;
/* 4 */
}
/*
Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/*
Prevent `sub` and `sup` elements from affecting the line height in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/*
1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
3. Remove gaps between table borders by default.
*/
table {
text-indent: 0;
/* 1 */
border-color: inherit;
/* 2 */
border-collapse: collapse;
/* 3 */
}
/*
1. Change the font styles in all browsers.
2. Remove the margin in Firefox and Safari.
3. Remove default padding in all browsers.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit;
/* 1 */
font-feature-settings: inherit;
/* 1 */
font-variation-settings: inherit;
/* 1 */
font-size: 100%;
/* 1 */
font-weight: inherit;
/* 1 */
line-height: inherit;
/* 1 */
letter-spacing: inherit;
/* 1 */
color: inherit;
/* 1 */
margin: 0;
/* 2 */
padding: 0;
/* 3 */
}
/*
Remove the inheritance of text transform in Edge and Firefox.
*/
button,
select {
text-transform: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Remove default button styles.
*/
button,
input:where([type='button']),
input:where([type='reset']),
input:where([type='submit']) {
-webkit-appearance: button;
/* 1 */
background-color: transparent;
/* 2 */
background-image: none;
/* 2 */
}
/*
Use the modern Firefox focus style for all focusable elements.
*/
:-moz-focusring {
outline: auto;
}
/*
Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
*/
:-moz-ui-invalid {
box-shadow: none;
}
/*
Add the correct vertical alignment in Chrome and Firefox.
*/
progress {
vertical-align: baseline;
}
/*
Correct the cursor style of increment and decrement buttons in Safari.
*/
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
/*
1. Correct the odd appearance in Chrome and Safari.
2. Correct the outline style in Safari.
*/
[type='search'] {
-webkit-appearance: textfield;
/* 1 */
outline-offset: -2px;
/* 2 */
}
/*
Remove the inner padding in Chrome and Safari on macOS.
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
/*
1. Correct the inability to style clickable types in iOS and Safari.
2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button;
/* 1 */
font: inherit;
/* 2 */
}
/*
Add the correct display in Chrome and Safari.
*/
summary {
display: list-item;
}
/*
Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
fieldset {
margin: 0;
padding: 0;
}
legend {
padding: 0;
}
ol,
ul,
menu {
list-style: none;
margin: 0;
padding: 0;
}
/*
Reset default styling for dialogs.
*/
dialog {
padding: 0;
}
/*
Prevent resizing textareas horizontally by default.
*/
textarea {
resize: vertical;
}
/*
1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
2. Set the default placeholder color to the user's configured gray 400 color.
*/
input::-moz-placeholder, textarea::-moz-placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
input::placeholder,
textarea::placeholder {
opacity: 1;
/* 1 */
color: #9ca3af;
/* 2 */
}
/*
Set the default cursor for buttons.
*/
button,
[role="button"] {
cursor: pointer;
}
/*
Make sure disabled buttons don't get the pointer cursor.
*/
:disabled {
cursor: default;
}
/*
1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
This can trigger a poorly considered lint error in some tools but is included by design.
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
/* 1 */
vertical-align: middle;
/* 2 */
}
/*
Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
*/
img,
video {
max-width: 100%;
height: auto;
}
/* Make elements with the HTML hidden attribute stay hidden by default */
[hidden]:where(:not([hidden="until-found"])) {
display: none;
}
:root {
--css-interop-darkMode: media;
--css-interop: true;
--css-interop-nativewind: true;
}
.container {
width: 100%;
}
@media (min-width: 640px) {
.container {
max-width: 640px;
}
}
@media (min-width: 768px) {
.container {
max-width: 768px;
}
}
@media (min-width: 1024px) {
.container {
max-width: 1024px;
}
}
@media (min-width: 1280px) {
.container {
max-width: 1280px;
}
}
@media (min-width: 1536px) {
.container {
max-width: 1536px;
}
}
.flex {
display: flex;
}
.bg-blue-500 {
--tw-bg-opacity: 1;
background-color: rgb(59 130 246 / var(--tw-bg-opacity, 1));
}
.font-bold {
font-weight: 700;
}

1326
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,17 +3,23 @@
"main": "expo-router/entry", "main": "expo-router/entry",
"version": "1.0.0", "version": "1.0.0",
"dependencies": { "dependencies": {
"@expo-google-fonts/inter": "^0.4.2",
"@expo-google-fonts/space-grotesk": "^0.4.1",
"@expo/ui": "~56.0.14", "@expo/ui": "~56.0.14",
"@react-navigation/bottom-tabs": "^7.18.18",
"@react-navigation/elements": "^2.9.19", "@react-navigation/elements": "^2.9.19",
"@react-navigation/native": "^7.2.5", "@react-navigation/native": "^7.3.18",
"@react-navigation/native-stack": "^7.16.0", "@react-navigation/native-stack": "^7.16.0",
"babel-preset-expo": "^57.0.9",
"expo": "~56.0.5", "expo": "~56.0.5",
"expo-blur": "~56.0.4",
"expo-constants": "~56.0.16", "expo-constants": "~56.0.16",
"expo-dev-client": "~56.0.16", "expo-dev-client": "~56.0.16",
"expo-device": "~56.0.4", "expo-device": "~56.0.4",
"expo-font": "~56.0.5", "expo-font": "~56.0.7",
"expo-glass-effect": "~56.0.4", "expo-glass-effect": "~56.0.4",
"expo-image": "~56.0.9", "expo-image": "~56.0.12",
"expo-linear-gradient": "~56.0.4",
"expo-linking": "~56.0.12", "expo-linking": "~56.0.12",
"expo-router": "~56.2.7", "expo-router": "~56.2.7",
"expo-splash-screen": "~56.0.10", "expo-splash-screen": "~56.0.10",
@@ -21,15 +27,19 @@
"expo-symbols": "~56.0.5", "expo-symbols": "~56.0.5",
"expo-system-ui": "~56.0.5", "expo-system-ui": "~56.0.5",
"expo-web-browser": "~56.0.5", "expo-web-browser": "~56.0.5",
"lucide-react": "^1.38.0",
"nativewind": "^4.2.6",
"prettier-plugin-tailwindcss": "^0.5.14",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",
"react-native": "0.85.3", "react-native": "0.85.3",
"react-native-gesture-handler": "~2.31.1", "react-native-gesture-handler": "~2.31.1",
"react-native-reanimated": "4.3.1", "react-native-reanimated": "^4.3.1",
"react-native-safe-area-context": "~5.7.0", "react-native-safe-area-context": "~5.7.0",
"react-native-screens": "4.25.2", "react-native-screens": "4.25.2",
"react-native-web": "~0.21.0", "react-native-web": "~0.21.0",
"react-native-worklets": "0.8.3" "react-native-worklets": "0.8.3",
"tailwindcss": "^3.4.19"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "~19.2.2", "@types/react": "~19.2.2",

View File

@@ -1,5 +1,11 @@
import { Stack } from "expo-router"; import { Stack } from 'expo-router';
import { ThemeProvider } from '../theme';
export default function RootLayout() { export default function RootLayout() {
return <Stack />; return (
<ThemeProvider>
<Stack />
</ThemeProvider>
);
} }

View File

@@ -1,17 +1,48 @@
import { Text, View, StyleSheet } from "react-native"; import { StyleSheet, Text, View } from 'react-native';
import '../global.css';
import { useTheme } from '../theme';
export default function Index() { export default function Index() {
const { colors, spacing, typography } = useTheme();
return ( return (
<View style={styles.container}> <View style={styles.container}>
<Text>Edit src/app/index.tsx to edit this screen.</Text> <Text
style={[
styles.title,
{
color: colors.textSecondary,
fontFamily: typography.sectionLabel.fontFamily,
fontSize: typography.sectionLabel.fontSize,
lineHeight: typography.sectionLabel.lineHeight,
letterSpacing: typography.sectionLabel.letterSpacing,
},
]}>
GradientButton variants
</Text>
</View> </View>
); );
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
safeArea: {
flex: 1,
},
container: { container: {
flex: 1, flex: 1,
alignItems: "center", paddingHorizontal: 20,
justifyContent: "center", paddingTop: 24,
justifyContent: 'center',
},
title: {
textTransform: 'uppercase',
marginBottom: 20,
},
stack: {
width: '100%',
},
disabledWrap: {
marginTop: 24,
}, },
}); });

3
src/global.css Normal file
View File

@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -0,0 +1,20 @@
import { type PropsWithChildren, useMemo } from 'react';
import colors from './colors';
import spacing, { borderRadius } from './spacing';
import typography from './typography';
import { ThemeContext } from './useTheme';
export function ThemeProvider({ children }: PropsWithChildren) {
const value = useMemo(
() => ({
colors,
typography,
spacing,
borderRadius,
}),
[],
);
return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;
}

17
src/theme/colors.ts Normal file
View File

@@ -0,0 +1,17 @@
export const colors = {
deepBackground: '#0A0A12',
surface: '#14141F',
surfaceElevated: '#1E1E2D',
border: '#2A2A3C',
primary: '#FF2E88',
secondary: '#7B3DFF',
tertiary: '#28E0F0',
success: '#3DDC97',
textPrimary: '#F4F4FA',
textSecondary: '#9A9AB4',
signatureGradient: ['#7B3DFF', '#FF2E88'] as const,
} as const;
export const signatureGradient = colors.signatureGradient;
export default colors;

16
src/theme/index.ts Normal file
View File

@@ -0,0 +1,16 @@
import colors from './colors';
import spacing, { borderRadius } from './spacing';
import typography from './typography';
export const theme = {
colors,
typography,
spacing,
borderRadius,
} as const;
export * from './ThemeProvider';
export * from './useTheme';
export { borderRadius, colors, spacing, typography };
export default theme;

18
src/theme/spacing.ts Normal file
View File

@@ -0,0 +1,18 @@
export const spacing = {
4: 4,
8: 8,
12: 12,
16: 16,
24: 24,
32: 32,
} as const;
export const space = spacing;
export const borderRadius = {
card: 20,
button: 14,
chip: 9999,
} as const;
export default spacing;

67
src/theme/typography.ts Normal file
View File

@@ -0,0 +1,67 @@
import { Inter_400Regular, Inter_500Medium } from '@expo-google-fonts/inter';
import { SpaceGrotesk_600SemiBold, SpaceGrotesk_700Bold } from '@expo-google-fonts/space-grotesk';
import { useFonts } from 'expo-font';
export const fontFamily = {
display: 'SpaceGrotesk_600SemiBold',
displayBold: 'SpaceGrotesk_700Bold',
body: 'Inter_400Regular',
bodyMedium: 'Inter_500Medium',
mono: 'monospace',
} as const;
export const typography = {
display: {
fontFamily: fontFamily.display,
fontSize: 40,
lineHeight: 48,
letterSpacing: -0.8,
},
screenTitle: {
fontFamily: fontFamily.displayBold,
fontSize: 26,
lineHeight: 32,
letterSpacing: -0.6,
},
cardTitle: {
fontFamily: fontFamily.display,
fontSize: 18,
lineHeight: 24,
letterSpacing: -0.2,
},
sectionLabel: {
fontFamily: fontFamily.mono,
fontSize: 11,
lineHeight: 16,
letterSpacing: 0.8,
textTransform: 'uppercase' as const,
},
body: {
fontFamily: fontFamily.body,
fontSize: 15,
lineHeight: 22,
letterSpacing: 0,
},
metadata: {
fontFamily: fontFamily.bodyMedium,
fontSize: 13,
lineHeight: 18,
letterSpacing: 0,
},
digits: {
fontFamily: fontFamily.mono,
fontSize: 11,
lineHeight: 16,
letterSpacing: 0.4,
},
} as const;
export const loadFonts = () =>
useFonts({
SpaceGrotesk_600SemiBold,
SpaceGrotesk_700Bold,
Inter_400Regular,
Inter_500Medium,
});
export default typography;

24
src/theme/useTheme.ts Normal file
View File

@@ -0,0 +1,24 @@
import { createContext, useContext } from 'react';
import colors from './colors';
import spacing, { borderRadius } from './spacing';
import typography from './typography';
export type ThemeContextValue = {
colors: typeof colors;
typography: typeof typography;
spacing: typeof spacing;
borderRadius: typeof borderRadius;
};
export const ThemeContext = createContext<ThemeContextValue | undefined>(undefined);
export const useTheme = () => {
const context = useContext(ThemeContext);
if (!context) {
throw new Error('useTheme must be used within a ThemeProvider');
}
return context;
};

10
tailwind.config.js Normal file
View File

@@ -0,0 +1,10 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ["src/**/*.{html,js,ts,jsx,tsx}"],
presets: [require("nativewind/preset")],
theme: {
extend: {},
},
plugins: [],
}

View File

@@ -15,6 +15,7 @@
"**/*.ts", "**/*.ts",
"**/*.tsx", "**/*.tsx",
".expo/types/**/*.ts", ".expo/types/**/*.ts",
"expo-env.d.ts" "expo-env.d.ts",
"nativewind-env.d.ts"
] ]
} }