diff --git a/site/.env.template b/site/.env.template index 0958048ff..100c65a98 100644 --- a/site/.env.template +++ b/site/.env.template @@ -1,11 +1,16 @@ +# A remplir avec vos credentials ALGOLIA_APP_ID= ALGOLIA_ADMIN_KEY= ALGOLIA_SEARCH_KEY= ALGOLIA_INDEX_PREFIX=monentreprise-{env}- + +# utiliser votre propre token +GITHUB_API_SECRET= + +# Voir https://github.com/betagouv/compta-mon-entreprise/issues/3 +DEEPL_API_SECRET= INSEE_SIRENE_API_SECRET= MATOMO_TOKEN= ATINTERNET_API_ACCESS_KEY= ATINTERNET_API_SECRET_KEY= -DEEPL_API_SECRET= ZAMMAD_API_SECRET_KEY= -GITHUB_API_SECRET= diff --git a/site/cypress/integration/mon-entreprise/english/landing.js b/site/cypress/integration/mon-entreprise/english/landing.js deleted file mode 100644 index d1435c44d..000000000 --- a/site/cypress/integration/mon-entreprise/english/landing.js +++ /dev/null @@ -1,15 +0,0 @@ -describe('Landing test', function () { - const fr = Cypress.env('language') === 'fr' - it('should not crash', function () { - cy.visit('/') - }) - it('should display logo', function () { - cy.visit('/') - cy.get('[data-test-id="logo img"]').should('be.visible') - }) - it('should display actionnable items', function () { - cy.visit('/') - cy.contains(fr ? 'Créer une entreprise' : 'Create a company') - cy.contains(fr ? 'Gérer mon activité' : 'Manage my business') - }) -}) diff --git a/site/cypress/integration/mon-entreprise/landing.js b/site/cypress/integration/mon-entreprise/landing.js new file mode 100644 index 000000000..20d56b317 --- /dev/null +++ b/site/cypress/integration/mon-entreprise/landing.js @@ -0,0 +1,38 @@ +const searchInputPath = '[data-testid=company-search-input]' +const searchResultsPath = '[data-testid=company-search-results]' +const currentCompanyPath = '[data-testid=currently-selected-company]' + +describe('Landing page', function () { + it('should not crash', function () { + cy.visit('/') + }) + + it('should display logo', function () { + cy.visit('/') + cy.get('[data-test-id="logo img"]').should('be.visible') + }) + + it('should provide the company search flow', function () { + cy.visit('/') + + cy.get(currentCompanyPath).should('not.exist') + + cy.get(searchInputPath).should('have.attr', 'placeholder') + cy.get(searchInputPath).invoke('attr', 'type').should('equal', 'search') + cy.get(searchInputPath).focus().type('noima') + + cy.wait(100) + + cy.get(searchResultsPath).children().should('have.length', 6) + cy.get(searchResultsPath).children().first().click() + + cy.url().should('include', '/g%C3%A9rer') + + cy.go('back') + + cy.get(currentCompanyPath).should('exist') + cy.get(currentCompanyPath).click() + + cy.url().should('include', '/g%C3%A9rer') + }) +}) diff --git a/site/package.json b/site/package.json index 7cd8be9d2..af2abfa3b 100644 --- a/site/package.json +++ b/site/package.json @@ -12,10 +12,7 @@ "engines": { "node": ">=12.16.1" }, - "browserslist": [ - "> 1% in FR", - "not ie < 11" - ], + "browserslist": ["> 1% in FR", "not ie < 11"], "scripts": { "prepare": "node scripts/prepare.js", "build": "yarn run build:prod && yarn run build:legacy", @@ -85,13 +82,16 @@ "react-router-dom": "^5.1.1", "react-router-hash-link": "^1.2.2", "react-signature-pad-wrapper": "^1.2.11", - "react-spring": "=8.0.27", + "react-spring": "^9.3.1", + "react-syntax-highlighter": "^10.1.1", + "react-use-measure": "^2.0.4", + "react-useportal": "^1.0.13", "recharts": "^1.8.5", "reduce-reducers": "^1.0.4", "redux": "^4.0.4", "regenerator-runtime": "^0.13.3", "reselect": "^4.0.0", - "styled-components": "^5.1.0", + "styled-components": "^5.3.1", "swr": "^0.1.16", "whatwg-fetch": "^3.0.0", "yaml": "^1.9.2" diff --git a/site/scripts/i18n/parser.config.js b/site/scripts/i18n/parser.config.js index 8eab782c0..55c17c5f8 100644 --- a/site/scripts/i18n/parser.config.js +++ b/site/scripts/i18n/parser.config.js @@ -32,11 +32,30 @@ module.exports = { html: ['HTMLLexer'], mjs: ['JavascriptLexer'], - js: ['JavascriptLexer'], // if you're writing jsx inside .js files, change this to JsxLexer - ts: ['JavascriptLexer'], - jsx: ['JsxLexer'], - tsx: ['JsxLexer'], - + js: [ + { + lexer: 'JavascriptLexer', + functions: ['t'], // Array of functions to match + }, + ], + ts: [ + { + lexer: 'JavascriptLexer', + functions: ['t'], // Array of functions to match + }, + ], + tsx: [ + { + lexer: 'JsxLexer', + functions: ['t'], // Array of functions to match + }, + ], + jsx: [ + { + lexer: 'JsxLexer', + functions: ['t'], // Array of functions to match + }, + ], default: ['JavascriptLexer'], }, diff --git a/site/source/api/sirene.ts b/site/source/api/sirene.ts index f1fff6c40..d10136401 100644 --- a/site/source/api/sirene.ts +++ b/site/source/api/sirene.ts @@ -46,7 +46,7 @@ async function searchFullText( text: string ): Promise | null> { const response = await fetch( - `https://entreprise.data.gouv.fr/api/sirene/v1/full_text/${text}?per_page=5` + `https://entreprise.data.gouv.fr/api/sirene/v1/full_text/${text}?per_page=15` ) if (!response.ok) { return null @@ -63,8 +63,6 @@ async function searchFullText( denomination: l1_normalisee, siren, })) - if (!etablissements.length) { - return null - } + return etablissements } diff --git a/site/source/components/CompanyDetails.tsx b/site/source/components/CompanyDetails.tsx index 062f4cbe1..863183ec1 100644 --- a/site/source/components/CompanyDetails.tsx +++ b/site/source/components/CompanyDetails.tsx @@ -4,6 +4,7 @@ import { H3 } from 'DesignSystem/typography/heading' import { SmallBody } from 'DesignSystem/typography/paragraphs' import { useEffect, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' +import styled from 'styled-components' import { Etablissement, fetchCompanyDetails } from '../api/sirene' type Company = { @@ -35,16 +36,20 @@ export default function CompanyDetails({ siren, denomination }: Etablissement) { if (company === null) { return ( -

+ {siren} est un SIREN non diffusable -

+ ) } return ( - <> -

+ +

{denomination || company ? ( <> {denomination || @@ -82,6 +87,10 @@ export default function CompanyDetails({ siren, denomination }: Etablissement) { )} - + ) } + +const CompanyContainer = styled.div` + text-align: left; +` diff --git a/site/source/components/CompanySearchField.tsx b/site/source/components/CompanySearchField.tsx new file mode 100644 index 000000000..167b09570 --- /dev/null +++ b/site/source/components/CompanySearchField.tsx @@ -0,0 +1,140 @@ +import { Grid } from '@mui/material' +import { useSearchFieldState } from '@react-stately/searchfield' +import { Card } from 'DesignSystem/card' +import { SearchField } from 'DesignSystem/field' +import { Body, Intro } from 'DesignSystem/typography/paragraphs' +import { ReactNode, useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import styled from 'styled-components' +import { Etablissement, searchDenominationOrSiren } from '../api/sirene' +import CompanyDetails from './CompanyDetails' +import { FromTop } from './ui/animate' +import { useDebounce } from './utils' + +export function CompanySearchField(props: { + label?: ReactNode + onValue?: () => void + onClear?: () => void + onSubmit?: (établissement: Etablissement) => void +}) { + const { t } = useTranslation() + + const searchFieldProps = { + ...props, + label: t('CompanySearchField.label', "Nom de l'entreprise, SIREN ou SIRET"), + description: t( + 'CompanySearchField.description', + 'Le numéro Siret est un numéro de 14 chiffres unique pour chaque entreprise. Ex : 40123778000127' + ), + onSubmit(value: string) { + searchDenominationOrSiren(value).then((result) => { + if (!result || result.length !== 1) { + return + } + props.onSubmit?.(result[0]) + }) + }, + placeholder: t( + 'CompanySearchField.placeholder', + 'Café de la gare ou 40123778000127' + ), + } + + const state = useSearchFieldState(searchFieldProps) + + const { onValue = () => {}, onClear = () => {} } = props + useEffect( + () => (!state.value ? onClear() : onValue()), + [state.value, onValue, onClear] + ) + + const [searchPending, results] = useSearchCompany(state.value) + + return ( + + + + + + {state.value && !searchPending && ( + {})} /> + )} + + + ) +} + +function useSearchCompany(value: string): [boolean, Array] { + const [result, setResult] = useState>([]) + const [searchPending, setSearchPending] = useState(!!value) + useEffect(() => { + setSearchPending(!!value) + if (!value) { + setResult([]) + } + }, [value, setResult, setSearchPending]) + + const debouncedValue = useDebounce(value, 300) + useEffect(() => { + if (!debouncedValue) { + return + } + searchDenominationOrSiren(debouncedValue).then((établissements) => { + setResult(établissements || []) + setSearchPending(false) + }) + }, [debouncedValue, setResult, setSearchPending]) + + return [searchPending && result.length <= 0, result.slice(0, 6)] +} + +function Results({ + results, + onSubmit, +}: { + results: Array + onSubmit: (établissement: Etablissement) => void +}) { + return !results.length ? ( + + + Aucune entreprise correspondante trouvée + + Vous pouvez réessayer avec votre SIREN ou votre SIRET pour un meilleur + résultat + + + + ) : ( + + + {results.map((etablissement) => ( + + onSubmit(etablissement)} compact> + + + + ))} + + + ) +} + +const MessageContainer = styled.div` + display: flex; + flex-direction: column; + background: ${({ theme }) => theme.colors.bases.primary[100]}; + margin-top: 0.4rem; + padding: 0.6rem 1rem 0; + border-radius: 0.3rem; + + ${Intro}, ${Body} { + margin-top: 0; + } +` diff --git a/site/source/components/PageHeader.tsx b/site/source/components/PageHeader.tsx index d6e4eceb8..a2fc4d1be 100644 --- a/site/source/components/PageHeader.tsx +++ b/site/source/components/PageHeader.tsx @@ -30,7 +30,7 @@ export default function PageHeader({ lg={picture ? 8 : 12} css={` display: flex; - flex-direction: column; + flex-direction: column !important; align-items: flex-start; `} > diff --git a/site/source/components/SimulationGoals.tsx b/site/source/components/SimulationGoals.tsx index 0f1397d81..b041f9693 100644 --- a/site/source/components/SimulationGoals.tsx +++ b/site/source/components/SimulationGoals.tsx @@ -3,14 +3,7 @@ import { updateSituation } from 'Actions/actions' import { SmallBody } from 'DesignSystem/typography/paragraphs' import { DottedName } from 'modele-social' import { formatValue, UNSAFE_isNotApplicable } from 'publicodes' -import React, { - createContext, - useCallback, - useContext, - useEffect, - useMemo, - useState, -} from 'react' +import React, { useCallback, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { firstStepCompletedSelector, @@ -23,6 +16,7 @@ import RuleLink from './RuleLink' import { Appear } from './ui/animate' import AnimatedTargetValue from './ui/AnimatedTargetValue' import { useEngine } from './utils/EngineContext' +import { useInitialRender, WatchInitialRender } from './utils/useInitialRender' type SimulationGoalsProps = { className?: string @@ -37,22 +31,16 @@ type SimulationGoalsProps = { toggles?: React.ReactNode } -const InitialRenderContext = createContext(true) - export function SimulationGoals({ publique, legend, toggles, children, }: SimulationGoalsProps) { - const [initialRender, setInitialRender] = useState(true) - useEffect(() => { - setInitialRender(false) - }, []) const isFirstStepCompleted = useSelector(firstStepCompletedSelector) return ( - + {toggles && {toggles}} - + ) } @@ -97,15 +85,6 @@ const StyledSimulationGoals = styled.div< }}; ` -function useInitialRender() { - const initialRender = useContext(InitialRenderContext) - // We use meme to prevent renders after the first one. That's why we disable - // the rule on the next line - // eslint-disable-next-line - const unChangedInitialRender = useMemo(() => initialRender, []) - return unChangedInitialRender -} - type SimulationGoalProps = { dottedName: DottedName label?: React.ReactNode diff --git a/site/source/components/ui/animate.tsx b/site/source/components/ui/animate.tsx index b577652e7..464e5ea94 100644 --- a/site/source/components/ui/animate.tsx +++ b/site/source/components/ui/animate.tsx @@ -1,13 +1,13 @@ import { DisableAnimationContext } from 'Components/utils/DisableAnimationContext' -import React, { Children, useContext, useEffect, useState } from 'react' +import React, { useContext } from 'react' import { animated, config as configPresets, - interpolate, - Spring, SpringConfig, - Trail, -} from 'react-spring/renderprops' + useSpring, + useTrail, +} from 'react-spring' +import useMeasure from 'react-use-measure' import styled from 'styled-components' type Props = { @@ -18,107 +18,93 @@ type Props = { delay?: number } -// Todo : better animate with fromRight on desktop +const AnimatedDiv = styled(animated.div)`` + export function FromBottom({ children, config = configPresets.stiff, style: inheritedStyle = {}, delay = 0, }: Props) { + const trail = useTrail(React.Children.count(children), { + delay, + config, + from: { opacity: 0, y: 10 }, + to: { opacity: 1, y: 0 }, + }) if (useContext(DisableAnimationContext)) { return <>{children} } + const childrenArray = React.Children.toArray(children) return ( - - i) ?? []} - native={true} - delay={delay} - config={config} - from={{ opacity: 0, y: 10 }} - to={{ opacity: 1, y: 0 }} - items={children} - > - {(item) => - ({ y, ...style }) => - ( - - y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' - ), - ...style, - ...inheritedStyle, - }} - > - {item} - - )} - - + <> + {trail.map((style, i) => ( + + {childrenArray[i]} + + ))} + ) } + export function FromTop({ children, config = configPresets.stiff, style: inheritedStyle = {}, delay = 0, }: Props) { + const trail = useTrail(React.Children.count(children), { + delay, + config, + from: { opacity: 0, y: -20 }, + to: { opacity: 1, y: 0 }, + }) if (useContext(DisableAnimationContext)) { return <>{children} } + const childrenArray = React.Children.toArray(children) return ( - - i) ?? []} - native={true} - delay={delay} - config={config} - from={{ opacity: 0, y: -20 }} - to={{ opacity: 1, y: 0 }} - items={children} - > - {(item, i) => - ({ y, ...style }) => - ( - - y !== 0 ? `translate3d(0, ${y}px,0)` : 'none' - ), - zIndex: Children.count(children) - i, // Hack for popover and stuffs - position: 'relative', - ...style, - ...inheritedStyle, - }} - > - {item} - - )} - - + <> + {trail.map((style, i) => ( + + {childrenArray[i]} + + ))} + ) } + export const FadeIn = ({ children, config = configPresets.default, delay = 0, -}: Props) => - useContext(DisableAnimationContext) ? ( - <>{children} - ) : ( - - {(style) => {children}} - - ) +}: Props) => { + const style = useSpring({ + delay, + config, + from: { opacity: 0 }, + to: { opacity: 1 }, + }) + if (useContext(DisableAnimationContext)) { + return <>{children} + } + return {children} +} export function Appear({ children, @@ -128,34 +114,31 @@ export function Appear({ delay = 0, style, }: Props & { unless?: boolean }) { - const [show, setShow] = useState(unless) - useEffect(() => { - window.setTimeout(() => setShow(true), 0) - }, []) - if (useContext(DisableAnimationContext)) { + const [ref, { height }] = useMeasure() + const animatedStyle = useSpring({ + delay, + config, + from: { opacity: 0, height: 0 }, + reset: false, + to: { opacity: 1, height }, + }) + + if (useContext(DisableAnimationContext) || unless) { return <>{children} } return ( - - {(animStyle) => ( - - {children} - - )} - +
{children}
+ ) } - -const ContainerDiv = styled.div` - display: flex; - flex-direction: column; -` diff --git a/site/source/components/utils/useInitialRender.tsx b/site/source/components/utils/useInitialRender.tsx new file mode 100644 index 000000000..dce4ef64c --- /dev/null +++ b/site/source/components/utils/useInitialRender.tsx @@ -0,0 +1,38 @@ +import { + createContext, + ReactNode, + useContext, + useEffect, + useMemo, + useState, +} from 'react' + +const InitialRenderContext = createContext(null) + +export function WatchInitialRender(props: { children: ReactNode }) { + const [initialRender, setInitialRender] = useState(true) + useEffect(() => { + setInitialRender(false) + }, []) + return ( + + {props.children} + + ) +} + +export function useInitialRender(): boolean { + const initialRenderFromContext = useContext(InitialRenderContext) + const unChangedInitialRender = useMemo(() => initialRenderFromContext, []) + + const [initialRender, setInitialRender] = useState(true) + useEffect(() => { + setInitialRender(false) + }, []) + + if (unChangedInitialRender !== null) { + return unChangedInitialRender + } + + return initialRender +} diff --git a/site/source/design-system/card/Card.tsx b/site/source/design-system/card/Card.tsx index 6971fef9e..3974cabce 100644 --- a/site/source/design-system/card/Card.tsx +++ b/site/source/design-system/card/Card.tsx @@ -12,7 +12,7 @@ import React, { ReactHTML, useRef } from 'react' import styled from 'styled-components' export type GenericCardProps = { - title: React.ReactNode + title?: React.ReactNode children?: React.ReactNode icon?: React.ReactNode } & GenericButtonOrLinkProps @@ -20,6 +20,7 @@ export type GenericCardProps = { type CardProps = GenericCardProps & { ctaLabel?: React.ReactNode children: React.ReactNode + compact?: boolean } export function Card({ @@ -27,6 +28,7 @@ export function Card({ icon, children, ctaLabel, + compact = false, ...ariaButtonProps }: CardProps) { const ref = useRef(null) @@ -36,13 +38,14 @@ export function Card({ const buttonOrLinkProps = useButtonOrLink(ariaButtonProps, ref) return ( - + {icon && {icon}} - + {title && }
{children} @@ -92,7 +95,7 @@ const IconContainer = styled.div` margin-top: ${({ theme }) => theme.spacings.md}; ` -export const CardContainer = styled.div` +export const CardContainer = styled.div<{ compact?: boolean }>` display: flex; width: 100%; height: 100%; @@ -106,9 +109,11 @@ export const CardContainer = styled.div` &:hover { box-shadow: ${({ theme }) => theme.elevations[3]}; } + &:focus, &:focus-visible { ${FocusStyle} } - padding: ${({ theme }) => theme.spacings.lg}; + padding: ${({ theme, compact = false }) => + compact ? theme.spacings.sm : theme.spacings.lg}; transition: box-shadow 0.15s; ` diff --git a/site/source/design-system/field/SearchField.tsx b/site/source/design-system/field/SearchField.tsx index 26f20a6f0..7ac61e637 100644 --- a/site/source/design-system/field/SearchField.tsx +++ b/site/source/design-system/field/SearchField.tsx @@ -1,6 +1,9 @@ import { useButton } from '@react-aria/button' import { useSearchField } from '@react-aria/searchfield' -import { useSearchFieldState } from '@react-stately/searchfield' +import { + SearchFieldState, + useSearchFieldState, +} from '@react-stately/searchfield' import { AriaSearchFieldProps } from '@react-types/searchfield' import { Loader } from 'DesignSystem/icons/Loader' import { SearchIcon } from 'DesignSystem/icons/SearchIcon' @@ -28,10 +31,21 @@ const SearchInputContainer = styled(StyledInputContainer)` padding-left: 0.5rem; ` +const IconContainer = styled.div<{ hasLabel?: boolean }>` + padding: calc( + ${({ hasLabel = false }) => (hasLabel ? '1rem' : '0rem')} + 0.5rem + ) + 0 0.5rem; +` + export default function SearchField( - props: AriaSearchFieldProps & { isSearchStalled: boolean } + props: AriaSearchFieldProps & { + state?: SearchFieldState + isSearchStalled?: boolean + } ) { - const state = useSearchFieldState(props) + const innerState = useSearchFieldState(props) + const state = props.state || innerState const ref = useRef(null) const buttonRef = useRef(null) const { @@ -49,7 +63,9 @@ export default function SearchField( hasError={!!props.errorMessage || props.validationState === 'invalid'} hasLabel={!!props.label} > - {props.isSearchStalled ? : } + + {props.isSearchStalled ? : } + )} {...inputProps} diff --git a/site/source/locales/ui-en.yaml b/site/source/locales/ui-en.yaml index e72dee328..f6a724db3 100644 --- a/site/source/locales/ui-en.yaml +++ b/site/source/locales/ui-en.yaml @@ -1,11 +1,11 @@ .cta: Launch the simulator -"404": +'404': action: Return to safe place message: This page does not exist or no longer exists -"<0> Pour en savoir plus, rendez-vous sur le site <3>aquoiserventlescotisations": +'<0> Pour en savoir plus, rendez-vous sur le site <3>aquoiserventlescotisations': urssaf: fr: <0> To find out more, go to <3>aquoiserventlescotisations.urssaf.fr -"<0>Covid-19 et chômage partiel : <3>Calculez votre indemnité": "<0>Covid-19 and Short-Time Work: <3>Calculate Your Benefit" +'<0>Covid-19 et chômage partiel : <3>Calculez votre indemnité': '<0>Covid-19 and Short-Time Work: <3>Calculate Your Benefit' <0>Oui: <0>Yes A quoi servent mes cotisations ?: What's included in my contributions? Accueil: Home @@ -36,17 +36,24 @@ Choisir plus tard: Choose later Chômage partiel: Partial unemployment Code d'intégration: Integration Code Commencer: Get started -"Commerçant, artisan, ou libéral ?": Trader, craftsman, or liberal? +'Commerçant, artisan, ou libéral ?': Trader, craftsman, or liberal? Commune ou code postal: Municipality or postal code +CompanySearchField: + ariaClearLabel: Delete search + description: + 'The Siret number is a 14 digit number unique to each company. Ex: + 40123778000127' + label: Company name, SIREN or SIRET + placeholder: Café de la gare or 40123778000127 Comparaison statuts: Status comparison Continuer: Continue Coronavirus: Coronavirus Cotisations: Contributions Cotisations sociales: Social contributions Covid 19: Covid 19 -"Covid-19 : Calculer l'impact du chômage partiel": "Covid-19: Calculating the impact of short-time work" -"Covid-19 : Découvrez les mesures de soutien aux entreprises": "Covid-19: Find out about business support measures" -"Covid-19 : Découvrir les mesures de soutien aux entreprises": "Covid-19: Discovering Business Support Measures" +"Covid-19 : Calculer l'impact du chômage partiel": 'Covid-19: Calculating the impact of short-time work' +'Covid-19 : Découvrez les mesures de soutien aux entreprises': 'Covid-19: Find out about business support measures' +'Covid-19 : Découvrir les mesures de soutien aux entreprises': 'Covid-19: Discovering Business Support Measures' Coût pour l'entreprise: Cost to the company Crée le: Created on Créer une: Create a @@ -80,14 +87,14 @@ Fiche de paie: Payslip Gestion des données personnelles: Management of personal data Guide du statut juridique: Legal status guide Gérant majoritaire: Chairman -"Gérant majoritaire ": "Majority Manager " +'Gérant majoritaire ': 'Majority Manager ' Gérant minoritaire: Managing director Gérant minoritaire ou égalitaire: Minority or equal manager Habituellement: Usually Imprimer: Print Impôt au barème: Tax on the scale Impôts: Taxes -"Indemnité chômage partiel prise en charge par l'état :": "State-paid short-time working allowance :" +"Indemnité chômage partiel prise en charge par l'état :": 'State-paid short-time working allowance :' Indépendant: Indépendant Indépendants et dirigeants: Self-employed and executives International: International @@ -110,7 +117,6 @@ Mon revenu: My income Montant: Amount Montant de l'impôt sur les sociétés: Amount of corporate income tax Montant des cotisations: Amount of contributions -"Nom de l'entreprise ou SIREN ": Company name or SIREN code Non: No Nous n'avons rien trouvé: We didn't find any matching registered company. Oui: Yes @@ -126,12 +132,12 @@ Pas en auto-entrepreneur: Not in auto-entrepreneur Pas implémenté: Not implemented Passer: Skip Personnalisez l'intégration: Customize the integration -"Perte de revenu net :": "Loss of net income :" +'Perte de revenu net :': 'Loss of net income :' Plafonds des tranches: Wafer ceilings Plein écran: Fullscreen Plus d'informations: More information (fr) Plusieurs associés: Several partners -"Pour en savoir plus, rendez-vous sur le site <2>aquoiserventlescotisations": +'Pour en savoir plus, rendez-vous sur le site <2>aquoiserventlescotisations': urssaf: fr: To find out more, visit <2>aquoiserventlescotisations.urssaf.fr Prise en charge du revenu net avec chômage partiel: Net income support with short-time working @@ -149,6 +155,7 @@ Quelques exemples de salaires: Some salary exemples Quelques intégrations: Some integrations Recherche en cours...: Searching... Rechercher: Search +Rechercher une entreprise: Search for a company Recommencer: Start again Rend non applicable les règles suivantes: Makes the following rules not applicable Renseigner mon entreprise: Find my company @@ -162,7 +169,7 @@ Revenir à la documentation: Go back to documentation Revenu (incluant les dépenses liées à l'activité): Revenue (including expenses related to the activity) Revenu disponible: Disposable income Revenu du dirigeant par statut: Executive income by status -"Revenu net avec chômage partiel :": "Net income with short-time work :" +'Revenu net avec chômage partiel :': 'Net income with short-time work :' Revenu net mensuel: Monthly net income Revenus étranger: Foreign income Règles de calculs: Rules @@ -190,14 +197,14 @@ Taux: Rate Taux calculé: Calculated rate Taux moyen: Average rate Total des retenues: Total withheld -"Total payé par l'entreprise :": "Total paid by the company :" +"Total payé par l'entreprise :": 'Total paid by the company :' Tout effacer: Delete all Tout le site: The whole site Tranche de l'assiette: Scale bracket Travailleurs Non Salariés (TNS): Non-salaried workers (TNS) Un seul associé: Only one partner Une idée ?<1>Contactez-nous !: Any ideas?<1>Contact us! -"Versement : ": "Payment : " +'Versement : ': 'Payment : ' Vie privée: Privacy Voir la fiche Urssaf: See the Urssaf sheet Voir la fiche de paie: See the pay slip @@ -252,11 +259,12 @@ après: registered, you'll have access to the following kbis: description: - "1": It is the official document attesting to <2>the legal existence of a + '1': It is the official document attesting to <2>the legal existence of a commercial enterprise. In most cases, to be opposable and authentic for administrative procedures, the extract must be less than 3 months old. - "2": This document is generally requested when applying for a public tender, + '2': + This document is generally requested when applying for a public tender, opening a professional bank account, purchasing professional equipment from distributors, etc. titre: The Kbis @@ -310,7 +318,7 @@ autoentrepreneur: titre: Auto-entrepeneur back: Return to the simulation barème: scale -calcul-avec: "Calculation from <1>with :" +calcul-avec: 'Calculation from <1>with :' cancelExample: Back to your situation car dépend de: because it depends on cards: @@ -324,7 +332,8 @@ cible: target clickexample: Click on a situation to see the result cliquez pour insérer cette suggestion: click to insert this suggestion comparaisonRégimes: - ACRE: <0>ACRE<1>1 year <1>(automatic and unconditional)<2>Between 3 + ACRE: + <0>ACRE<1>1 year <1>(automatic and unconditional)<2>Between 3 and 4 quarters <2>(subject to eligibility requirements) AS: tagline: The all-inclusive plan @@ -394,18 +403,24 @@ comparaisonRégimes: <0>Retirement pay retraiteEstimation: infobulle: - AS: Pension calculated for 172 quarters contributed to the general scheme with + AS: + Pension calculated for 172 quarters contributed to the general scheme with no change in income. - auto: Pension calculated for 172 quarters contributed as auto-entrepreneur with + auto: + Pension calculated for 172 quarters contributed as auto-entrepreneur with no change in income. - indep: Pension calculated for 172 quarters contributed to the self-employed + indep: + Pension calculated for 172 quarters contributed to the self-employed scheme with no change in income. infobulles: - AS: Pension calculated for 172 quarters contributed to the general scheme with + AS: + Pension calculated for 172 quarters contributed to the general scheme with no change in income. - auto: Pension calculated for 172 quarters of auto-entrepreneur contributions + auto: + Pension calculated for 172 quarters of auto-entrepreneur contributions with no change in income. - indep: Pension calculated for 172 quarters of contributions to the self-employed + indep: + Pension calculated for 172 quarters of contributions to the self-employed scheme with no change in income. legend: | <0>Retirement pay @@ -429,8 +444,8 @@ comparaisonRégimes: AS: SAS, SASU or SARL with minority director auto: Auto-entreprise indep: - "1": EI, EIRL, EURL or SARL with majority director - "2": EI or EIRL + '1': EI, EIRL, EURL or SARL with majority director + '2': EI or EIRL legend: Possible legal status sécuritéSociale: | <0> Social security @@ -444,13 +459,13 @@ comparaisonRégimes: trimestreValidés: <0>Number of quarters validated <1>(for retirement) composantes: components coronavirus: - description: "<0>Coronavirus and short-time working: what impact on my + description: '<0>Coronavirus and short-time working: what impact on my income?<1>The government is putting in place measures to support employees affected by the Coronavirus crisis. One of the key measures is the - assumption of the entire short-time working compensation by the State." + assumption of the entire short-time working compensation by the State.' page: description: Estimate net income with short-time working benefits - titre: "Coronavirus and short-time working: what impact on your income?" + titre: 'Coronavirus and short-time working: what impact on your income?' cotisation: contribution créer: cta: @@ -460,22 +475,25 @@ créer: company, you must choose a legal status adapted to your activity ressources: autoEntrepreneur: - body: Do you want to become an auto-entrepreneur? Discover the steps to start + body: + Do you want to become an auto-entrepreneur? Discover the steps to start your business cta: Consult the procedures title: Auto-entrepreneur procedure comparaison: - body: Self-employed, assimilated employee or auto-entrepreneur? Calculate the + body: + Self-employed, assimilated employee or auto-entrepreneur? Calculate the differences in terms of income, contributions, pension, etc. cta: Compare title: Plan Comparator listeStatuts: - body: Do you already know which status to choose? Go directly to the list of + body: + Do you already know which status to choose? Go directly to the list of related procedures cta: See the list title: List of legal statuses titre: Create a company - warningPL: "Note: the case of regulated liberal professions is not covered" + warningPL: 'Note: the case of regulated liberal professions is not covered' d'aides: aids dividendes: warning: <0>This simulation is only given as an indication. It only concerns @@ -522,8 +540,7 @@ embauche: titre: Register to a work medicine office page: description: All the necessary steps to hire your first employee in France. - titre: | - Hiring procedure in France + titre: The formalities for hiring pension: description: Find your pension institute (Fr) titre: Contact the compulsory supplementary pension institution assigned to you @@ -551,24 +568,28 @@ entreprise: title: After the creation simu: assimilé: - body: Simulate the amount of your social contributions to prepare your business + body: + Simulate the amount of your social contributions to prepare your business plan. cta: Simulate compensation title: Remuneration simulator for SASU managers autoEntrepreneur: - body: Simulate the amount of your social security contributions and taxes and + body: + Simulate the amount of your social security contributions and taxes and estimate your future net income. cta: Simulate income title: Auto-entrepreneur income simulator indépendant: - body: Simulate the amount of your social contributions to prepare your business + body: + Simulate the amount of your social contributions to prepare your business plan. cta: Simulate contributions title: Self-employed contribution simulator retour: Choose another status tâches: adresse: - description: <0><0>The address is the physical space where your company will + description: + <0><0>The address is the physical space where your company will be incorporated. In certain places and situations, you can benefit from substantial public financing (exemption from charges, taxes, etc.). <2>More information (Fr) @@ -590,7 +611,8 @@ entreprise: titre: Make a declaration of asset allocation assurance: - description: <0>An SME or self-employed person must protect themselves against + description: + <0>An SME or self-employed person must protect themselves against the main risks to which they are exposed and take out guarantee contracts. Whether it is a tenant or owner of its walls, the company must insure its buildings, its professional equipment, its goods, its @@ -602,9 +624,10 @@ entreprise: creation process. It is automatically saved in your browser. banque: description: - "1": The purpose of a <1>professional bank account is to separate your + '1': + The purpose of a <1>professional bank account is to separate your company's assets from your personal assets. - "2": "The professional bank account allows you to:" + '2': 'The professional bank account allows you to:' EI: If its opening is not obligatory for an EI, it is strongly recommended. liste: > <0>Differentiate your private and professional operations and simplify @@ -613,7 +636,8 @@ entreprise: <1>Facilitate any tax audit operations. titre: Open a business bank account capital: - description: <0>The <1>deposit of share capital must be made at the time of + description: + <0>The <1>deposit of share capital must be made at the time of the incorporation of a company by any person acting on behalf of the company and having received funds from contributions in cash (sum of money) from the creditors of the company (shareholder or @@ -630,7 +654,8 @@ entreprise: formeJuridique: titre: Choose the legal status formulaire: - description: <0>You can register online at any time, save it and return to it as + description: + <0>You can register online at any time, save it and return to it as you wish.<1><2>Doing it online titre: Register my company online journal: @@ -670,7 +695,8 @@ entreprise: titre: Publish a notice of creation in a newspaper nom: - description: <0><0>The corporate name is the name of your company in the + description: + <0><0>The corporate name is the name of your company in the eyes of the law, written on all your administrative documents. It may be different from your business name.<1>It is advisable to check that the name is available, i.e. that it does not infringe on a name already @@ -678,7 +704,8 @@ entreprise: domain name, etc. You can check in the <2>INPI database. titre: Find a corporate name objetSocial: - description: The <1>corporate purpose of the company ("objet social") is the + description: + The <1>corporate purpose of the company ("objet social") is the main activity run. A secondary activity can be registered. titre: Write the corporate purpose of the company statuts: @@ -700,9 +727,11 @@ feedback: bad: form: email: Your email (if you would like an answer from us) - headline: Your feedback is valuable to us in order to continuously improve this + headline: + Your feedback is valuable to us in order to continuously improve this site. What should we work on to better meet your expectations? - beta-testeur: To continue to give your opinion and access to the new products in + beta-testeur: + To continue to give your opinion and access to the new products in preview, register on the <2>list of beta-testers question: Was this page useful to you? reportError: Make a suggestion @@ -710,11 +739,12 @@ feedback: thanks: Thank for your feedback! You can contact us directly at <1> <2>contact@mon-entreprise.beta.gouv.fr footer: - accessibilité: "Accessibility: not compliant" + accessibilité: 'Accessibility: not compliant' formeJuridique: EI: Also called company in own name or company in a personal name. No capital contribution is necessary. Private wealth and corporate wealth are one. - EIRL: Allows you to protect your personal assets by allocating specific capital + EIRL: + Allows you to protect your personal assets by allocating specific capital to your professional activity. Society and the individual are the same person. Not suitable if the sole shareholder is a legal entity (company) or if you plan to welcome other shareholders during the development of your @@ -722,10 +752,12 @@ formeJuridique: EURL: The company has only one partner. Liability is limited to the amount of the capital contribution of the sole shareholder. Evolves into a SARL when new partners join the company. - SA: Composed of at least 2 shareholders. This is the only status that allows you + SA: + Composed of at least 2 shareholders. This is the only status that allows you to be listed on the stock exchange (from 7 shareholders). The minimum share capital is €37.000. - SARL: Composed of at least 2 partners whose financial responsibility is limited + SARL: + Composed of at least 2 partners whose financial responsibility is limited to the amount of their contribution to the company's capital. The minimum capital is freely fixed in the articles of association. SAS: Company with at least 2 partners. The financial liability of the @@ -749,7 +781,8 @@ formeJuridique: gerer: choix: embauche: - body: Calculate the total amount your company will have to spend to pay your + body: + Calculate the total amount your company will have to spend to pay your next employee cta: Launch the simulator title: Estimate the amount of a hiring @@ -761,7 +794,8 @@ gérant minoritaire: director is in minority (or equality), or is part of a managing board that is in minority (or equality). page: - description: Some special rules apply depending on the amount of shares owned by + description: + Some special rules apply depending on the amount of shares owned by the director and this can lead to a different status when creating your company in France titre: Chairman or managing director in France @@ -769,12 +803,14 @@ gérant minoritaire: gérer: choix: chomage-partiel: - body: Calculate the remaining amount to be paid after reimbursement from the + body: + Calculate the remaining amount to be paid after reimbursement from the state when you activate the device for an employee. cta: See the simulator title: Partial activity déclaration: - body: Easily calculate the amount of payroll taxes to be reported on your 2020 + body: + Easily calculate the amount of payroll taxes to be reported on your 2020 tax return cta: Completing my return title: Income tax return (self-employed) @@ -787,7 +823,8 @@ gérer: cta: Launch the simulator title: Estimating the amount of corporate tax revenus: - body: Estimate the exact amount of your contributions thanks to the {{regime}} + body: + Estimate the exact amount of your contributions thanks to the {{regime}} simulator of the Urssaf cta: Calculate my net income title: Income as a business owner @@ -800,14 +837,16 @@ gérer: auto: Are you an auto-entrepreneur? changer: Change the selected company dirigeant: - description: If you are a majority director or a member of a majority board, you + description: + If you are a majority director or a member of a majority board, you will not have the same social security coverage as a minority director. titre: Are you a majority shareholder? majoritaire: Majority director minoritaire: Minority director ressources: autoEntrepreneur: - body: You will be able to declare your turnover, pay your contributions, and + body: + You will be able to declare your turnover, pay your contributions, and more generally find all the information relating to the status of auto-entrepreneur cta: Visit the site @@ -816,19 +855,21 @@ gérer: body: The list of things to do to make sure you don't forget anything when hiring a new employee cta: See the list of steps - title: "Discover the hiring process " + title: 'Discover the hiring process ' export: body: The form to apply for international mobility (secondment or multi-job) cta: Fill in the form title: Exporting your business to Europe kbis: - body: The Kbis is a document to justify the registration of the company at the + body: + The Kbis is a document to justify the registration of the company at the <2>RCS and to prove its legal existence. This document can be retrieved free of charge for your company via the MonIdeNum website. cta: Go to monIdeNum.fr title: Get a Kbis extract kbis-autoentrepreneur: - body: Self-employed entrepreneurs do not have a Kbis. However, they can obtain + body: + Self-employed entrepreneurs do not have a Kbis. However, they can obtain and present a K extract. See the service-public website for more information. cta: Visit the site @@ -843,8 +884,8 @@ heure: hour heures: hours impotSociété: exerciceDates: Exercise from <2> to <6> - warning: "This simulator is aimed at <2>“TPE”: it takes into account the - reduced corporate tax rates." + warning: 'This simulator is aimed at <2>“TPE”: it takes into account the + reduced corporate tax rates.' imprimer: Print impôt: tax impôt sur le revenu: income tax @@ -854,29 +895,38 @@ inférieurs à: lower than jour: day jours: days landing: - aboutUs: "<0>Who are we?<1>We are a small, independent, multidisciplinary + aboutUs: '<0>Who are we?<1>We are a small, independent, multidisciplinary <2>team within the<5>Urssaf. We are committed to being close to your needs in order to constantly improve this site in accordance with the <8>beta.gouv.fr approach.<2>We have developed this site to assist entrepreneurs in the development of their business.<3>Our objective is to remove all uncertainties with regard to the administration so that you - can concentrate on what matters: your business." + can concentrate on what matters: your business.' choice: + continue: Continue with the company create: - body: Assistance in choosing a legal status and a complete list of the steps + body: + Assistance in choosing a legal status and a complete list of the steps involved in setting up a business - title: Create a company + title: Starting a business manage: - body: Personalized tools to anticipate the amount of social contributions to be + body: + Personalized tools to anticipate the amount of social contributions to be paid and better manage your cash flow. title: Manage my business simulators: body: The exhaustive list of all the simulators available on the site. - title: Browse the simulators - covid19: "Covid-19: Calculating the impact of short-time work" + title: Discover all the simulators and assistants + choices: + continue: Continue with the company + covid19: 'Covid-19: Calculating the impact of short-time work' + outils: <0>The tools at your disposal<1>We provide you with assistants and + simulators to help you manage your business, anticipate levies and plan your + cash flow accordingly. + outils_cta: <0> Discover all simulators and assistants seeSimulators: See the simulators list subtitle: The resources needed to develop your business, from legal status to hiring. - title: The official assistant for entrepreneurs + title: The official tools for entrepreneurs legalNotice: contact: content: | @@ -913,13 +963,15 @@ non: no non applicable si: not applicable if non déductible: not deductible noresults: No results +ou: or oui: yes page: documentation: title: Documentation simulateurs: accueil: - description: <0>All the simulators on this site are :<1><0><0>Maintained + description: + <0>All the simulators on this site are :<1><0><0>Maintained up to date with the latest legislative developments<1><0>Continuously improved to increase the number of devices considered<2><0>Easily and freely integrates on any @@ -967,13 +1019,15 @@ pages: CEDEX 07<22>Updated on 29/01/2021 choix-statut: meta: - description: "SASU, EURL, auto-entrepreneur, EIRL: choose the status that suits - you best with this wizard" + description: + 'SASU, EURL, auto-entrepreneur, EIRL: choose the status that suits + you best with this wizard' title: Help in choosing the legal status common: ressources-auto-entrepreneur: FAQ: - body: An exhaustive and updated list of all the frequent (and less frequent) + body: + An exhaustive and updated list of all the frequent (and less frequent) questions that one is led to ask as an auto-entrepreneur cta: See the answers title: Frequently asked questions @@ -983,7 +1037,8 @@ pages: cta: See the help title: How to declare your income to the tax authorities? dévelopeurs: - bibliothèque: "<0>Integrate our calculation library<1>If you think that your + bibliothèque: + "<0>Integrate our calculation library<1>If you think that your website or service would benefit from displaying salary calculations, for example switching from gross to net salary, good news: all the tax and contribution calculations behind mycompanyinfrance are free and easily @@ -1031,12 +1086,14 @@ pages: développeurs: choice: github: - body: The entire socio-fiscal calculation engine developed by the Urssaf, freely + body: + The entire socio-fiscal calculation engine developed by the Urssaf, freely available as an NPM library. cta: Start title: Calculation library library: - body: The entire socio-fiscal calculation engine developed by the Urssaf, freely + body: + The entire socio-fiscal calculation engine developed by the Urssaf, freely available as an NPM library. cta: Start title: Calculation library @@ -1046,21 +1103,23 @@ pages: cta: Discover title: Publicodes code: - description: "Here is the code to copy and paste on your site:" + description: 'Here is the code to copy and paste on your site:' titre: Integration Code - code à copier: "Here is the code to copy and paste on your site:" - couleur: "What color? " + code à copier: 'Here is the code to copy and paste on your site:' + couleur: 'What color? ' home: choice: iframe: - body: Integrate one of our simulators in one click into your website, via a + body: + Integrate one of our simulators in one click into your website, via a turnkey script. cta: Start title: Integrate a simulator library: <0>Using the calculation engine<1>The entire socio-fiscal calculation engine developed by Urssaf, freely available in the form of an NPM library. - description: In addition to the mycompanyinfrance site, we provide free and open + description: + In addition to the mycompanyinfrance site, we provide free and open source tools to integrate on your website. You can thus include the tools created for <1>mycompanyinfrance directly in the usual paths of your users. @@ -1069,9 +1128,10 @@ pages: csp-1: <0>The error below that appears in the console is related to the communication between the parent page and the iframe for automatic resizing to the displayed content. - csp-2: "You can correct it with the following policy:" + csp-2: 'You can correct it with the following policy:' csp-title: Iframe integration and content security policy - intro: <0><0>Integrate the web module<1>Our simulators can be integrated + intro: + <0><0>Integrate the web module<1>Our simulators can be integrated seamlessly by adding a simple line of code to your web page.<2>You can choose the simulator to integrate and <2>customize the main color of the module to fit the visual theme of your page.<3>The @@ -1083,30 +1143,35 @@ pages: gérer: aide-déclaration-indépendant: meta: - description: Easily calculate the amount of payroll taxes to report on your 2019 + description: + Easily calculate the amount of payroll taxes to report on your 2019 income tax return. - title: "Self-employed tax return: calculation of the amount of contributions" + title: 'Self-employed tax return: calculation of the amount of contributions' shortname: Income tax return assistance title: Help with your 2019 income tax return demande-mobilité: meta: - description: Interactive form to be completed for self-employed persons wishing + description: + Interactive form to be completed for self-employed persons wishing to carry out their activity in other European countries - title: "Self-employed: demand for mobility in Europe" + title: 'Self-employed: demand for mobility in Europe' shortname: Demand for mobility in Europe simulateurs: EI: meta: description: Calculation of income from turnover, after deduction of contributions and taxes - ogDescription: "Thanks to the auto-entrepreneur income simulator developed by + ogDescription: + 'Thanks to the auto-entrepreneur income simulator developed by Urssaf, you can estimate your income based on your monthly or annual turnover to better manage your cash flow. Or the other way round: find - out how much to charge to achieve a certain income." - ogTitle: "Sole proprietorship: quickly calculate your net income from your - turnover and vice versa" - titre: "Sole proprietorship (EI): income simulator" - seo explanation: <0>How to calculate the net income of a sole trader?<1>A + out how much to charge to achieve a certain income.' + ogTitle: + 'Sole proprietorship: quickly calculate your net income from your + turnover and vice versa' + titre: 'Sole proprietorship (EI): income simulator' + seo explanation: + <0>How to calculate the net income of a sole trader?<1>A sole trader must pay social security contributions to the authorities. These contributions are used to finance social security, and open up rights, particularly for retirement and health insurance. They are also @@ -1131,7 +1196,8 @@ pages: shortname: Sole proprietorship title: Income simulator for sole proprietorship (EI) accueil: - header: All the simulators on this site are kept up to date with the latest + header: + All the simulators on this site are kept up to date with the latest legislative developments. titre: Simulators available aides-embauche: @@ -1139,15 +1205,19 @@ pages: apprenti: For the hiring of an apprentice or a young person on a professionalization contract.<1>The aid is paid <3>monthly and automatically by the Service and Payment Agency (ASP). - emploi franc: For the hiring of a young person from a priority district of the + emploi franc: + For the hiring of a young person from a priority district of the city (QPV). The aid can be up to €17,000 over three years.<1>The aid is paid every <3>6 months by Pôle Emploi. - handicapé: For the recruitment of a disabled worker.<1>The aid is paid + handicapé: + For the recruitment of a disabled worker.<1>The aid is paid <3>quarterly by the Agence de services et de paiement (ASP). - jeune: For the hiring of a young person under the age of 26 on a permanent + jeune: + For the hiring of a young person under the age of 26 on a permanent contract or for a fixed-term contract of at least 3 months.<1>The aid is paid <3>quarterly by the Services and Payment Agency (ASP). - senior: For a jobseeker aged 45 or over hired under a professionalization + senior: + For a jobseeker aged 45 or over hired under a professionalization contract.<1>The aid is paid by Pôle Emploi in two instalments of €1,000 each. card: @@ -1160,41 +1230,47 @@ pages: message fin: You can now simulate the exact cost of hiring by selecting an eligible grant. meta: - description: Find out about the main forms of aid for hiring and estimate their + description: + Find out about the main forms of aid for hiring and estimate their amount by answering a few questions. title: Hiring incentives - outro: <0>Learn more about incentives<1>As part of the "Plan Relance" plan, + outro: + <0>Learn more about incentives<1>As part of the "Plan Relance" plan, the government is putting in place a series of measures to encourage new hires.<2>Visit the portal <2>#1jeune1solution to learn more. titres: aides: The incentives aidesDisponibles: Aid incentives autresAides: Other incentives - warning: This simulator presents a reduced list of hiring aids and does not + warning: + This simulator presents a reduced list of hiring aids and does not include all the eligibility conditions.<1>A more complete simulation can be made by clicking on "Simulate a Hiring". artiste-auteur: meta: description: Estimate social contributions on copyright and BNC income - title: "Artist-author: calculation of Urssaf membership fees" + title: 'Artist-author: calculation of Urssaf membership fees' shortname: Artist-author title: Estimate my artist/author dues auto-entrepreneur: meta: - description: Calculation of your income based on turnover, after deduction of + description: + Calculation of your income based on turnover, after deduction of contributions and income tax. - ogDescription: "Thanks to the auto-entrepreneur income simulator developed by + ogDescription: + 'Thanks to the auto-entrepreneur income simulator developed by Urssaf, you can estimate the amount of your income based on your monthly or annual turnover to better manage your cash flow. Or in the opposite direction: to know what amount to invoice to achieve a - certain income." - ogTitle: "Auto-entrepreneur: quickly calculate your net income from sales and - vice versa" - titre: "Auto-entrepreneurs: income simulator" - seo explanation: "<0>How do you calculate the net income for an + certain income.' + ogTitle: + 'Auto-entrepreneur: quickly calculate your net income from sales and + vice versa' + titre: 'Auto-entrepreneurs: income simulator' + seo explanation: '<0>How do you calculate the net income for an auto-entrepreneur?<1>An auto-entrepreneur has to pay social security contributions to the administration (also known as - \"social charge\"). These social contributions are used to finance + "social charge"). These social contributions are used to finance social security, and give rights for retirement or health insurance. They are also used to finance vocational training.<2><0> <2>See details of how the contributions are calculated<3>But this is @@ -1202,7 +1278,7 @@ pages: account all expenses incurred in the course of the professional activity (assets, raw materials, premises, transport). Although they are not useful for the calculation of contributions and taxes, they must be - taken into account to estimate the viability of one''s + taken into account to estimate the viability of one''''s activity.<4>The complete calculation formula is therefore:<1><0>Net income = Turnover - Social contributions - Professional expenses<5>How to calculate income tax for an @@ -1216,20 +1292,22 @@ pages: carried out. It is said to be lump-sum because it does not take into account the actual expenses incurred in the activity.<9><0> <2>See details of the calculation of the income allowance for an - auto-entrepreneur<10>Useful resources<11><0>'" + auto-entrepreneur<10>Useful resources<11><0>''' shortname: Auto-entrepreneur title: Self-entrepreneur Income Simulator titre: Auto-entrepreneur income simulator auxiliaire: shortname: Medical Auxiliary title: Income simulator for a private medical assistant - tooltip: Nurses, masseur-physiotherapists, chiropodists, speech therapists and + tooltip: + Nurses, masseur-physiotherapists, chiropodists, speech therapists and orthoptists avocat: shortname: Lawyer title: Income simulator for private lawyers cartes: - intégrer module web: <0>Integrate the web module<1>Add this simulator to + intégrer module web: + <0>Integrate the web module<1>Add this simulator to your website in one click chirurgien-dentiste: shortname: Dental surgeon @@ -1268,15 +1346,18 @@ pages: The partial activity allowance is subject to the CSG/CRDS and to an disease contribution in some cases. For more information, see the explanatory page on [the Urssaf website](https://www.urssaf.fr/portail/home/actualites/toute-lactualite-employeur/activite-partielle--nouveau-disp.html) (french). meta: - description: Calculation of the net income for the employee and the remaining + description: + Calculation of the net income for the employee and the remaining amount to be paid by the employer after reimbursement by the State, taking into account all social contributions. - ogDescription: Access a first estimate by entering from a gross wage. You will + ogDescription: + Access a first estimate by entering from a gross wage. You will then be able to personalize your situation (part-time, agreement, etc). Take into account all contributions, including those specific to the allowance (CSG and CRDS). - ogTitle: "Short-time working simulator: find out the impact on the net salaried - income and the total employer cost." + ogTitle: + 'Short-time working simulator: find out the impact on the net salaried + income and the total employer cost.' titre: Calculation of the short-time working allowance in France seo: <0>How is the partial activity allowance calculated?<1>The basic partial activity allowance is fixed by law at <2>70% of gross @@ -1308,17 +1389,20 @@ pages: For more information, see the explanatory page on the <2>Urssaf website. shortname: Partial unemployment - title: "Covid-19: Short-time work simulator" + title: 'Covid-19: Short-time work simulator' comparaison: meta: - description: Self-employed, self-employed or similarly employed? With this + description: + Self-employed, self-employed or similarly employed? With this comparison, find the plan that suits you best - title: "Starting a business: a comparison of social schemes" + title: 'Starting a business: a comparison of social schemes' shortname: Status Comparison - title: "Self-employed, assimilated employee or auto-entrepreneur: which plan to - choose?" + title: + 'Self-employed, assimilated employee or auto-entrepreneur: which plan to + choose?' dirigean sasu: - explication seo: "<0>How to calculate the salary of a SASU executive? <1>As + explication seo: + '<0>How to calculate the salary of a SASU executive? <1>As for a conventional employee, the SASU <1>manager pays social security contributions on the salary he or she pays. The contributions are calculated in the same way as for the employee: they are broken down @@ -1327,21 +1411,23 @@ pages: manager-employee does not pay <2>unemployment contributions. Moreover, they do not benefit from the <5>general reduction in contributions or from the schemes governed by the Labour Code, such as - <9>overtime or bonuses.<3>A SASU executive's salary can be - calculated by entering the total amount of the salary in the \"total - expense\" box, but he or she can claim the <2>ACRE reduction at the + <9>overtime or bonuses.<3>A SASU executive''s salary can be + calculated by entering the total amount of the salary in the "total + expense" box, but he or she can claim the <2>ACRE reduction at the beginning of the activity, under certain conditions.<4>You can use our simulator to calculate the <2>net remuneration from a - super-gross amount allocated to the executive's remuneration. To do + super-gross amount allocated to the executive''s remuneration. To do this, simply enter the announced compensation in the total loaded box. The simulation can then be refined by answering the various - questions." + questions.' dividendes: meta: - description: Calculate the amount of tax and contributions on dividends paid by + description: + Calculate the amount of tax and contributions on dividends paid by your company. title: Dividends - seo: <0>Dividends and distributions<1>At the end of a company's financial + seo: + <0>Dividends and distributions<1>At the end of a company's financial year, the result of the previous year can be kept in reserve (for future investments) or paid out as dividends. From the point of view of the beneficiaries, this is income from movable capital, subject to specific @@ -1364,15 +1450,17 @@ pages: meta: description: Calculation of income from turnover, after deduction of contributions and taxes - ogDescription: "Thanks to the income simulator for sole proprietorships + ogDescription: 'Thanks to the income simulator for sole proprietorships developed by Urssaf, you can estimate your income based on your monthly or annual turnover to better manage your cash flow. Or the other way round: find out how much to charge to achieve a certain - income." - ogTitle: "Sole proprietorship: quickly calculate your net income from your - turnover and vice versa" - titre: "Sole proprietorship (EI): income simulator" - seo explanation: <0>How to calculate the net income of a sole trader?<1>A + income.' + ogTitle: + 'Sole proprietorship: quickly calculate your net income from your + turnover and vice versa' + titre: 'Sole proprietorship (EI): income simulator' + seo explanation: + <0>How to calculate the net income of a sole trader?<1>A sole trader must pay social security contributions to the authorities. These contributions are used to finance social security, and open up rights, particularly for retirement and health insurance. They are also @@ -1402,47 +1490,53 @@ pages: meta: description: Calculation of income from turnover, after deduction of contributions and taxes - ogDescription: "Thanks to the income simulator for EIRL developed by Urssaf, you + ogDescription: + 'Thanks to the income simulator for EIRL developed by Urssaf, you can estimate the amount of your income based on your monthly or annual turnover to better manage your cash flow. Or in the opposite - direction: know how much to charge to reach a certain income." - ogTitle: "EIRL manager: quickly calculate your net income from your turnover and - vice versa" - titre: "EIRL : income simulator for managers" + direction: know how much to charge to reach a certain income.' + ogTitle: + 'EIRL manager: quickly calculate your net income from your turnover and + vice versa' + titre: 'EIRL : income simulator for managers' shortname: EIRL title: EIRL Simulator eurl: meta: description: Calculation of the net salary from the total allocated to remuneration and vice versa - ogDescription: As an employee-equivalent manager, you can immediately calculate + ogDescription: + As an employee-equivalent manager, you can immediately calculate your net income after tax from the total allocated to your remuneration. ogTitle: "EURL manager's remuneration: a simulator to find out your net salary" - titre: "EURL : income simulator for managers" + titre: 'EURL : income simulator for managers' shortname: EURL title: EURL Simulator expert-comptable: shortname: Chartered Accountant title: Income simulator for chartered accountant and auditor in private practice indépendant: - cotisations-forfaitaires: "Amount of lump sum contributions : " + cotisations-forfaitaires: 'Amount of lump sum contributions : ' meta: - description: Calculation of net income after tax and contributions based on + description: + Calculation of net income after tax and contributions based on turnover and vice versa - title: "Self-employed: income simulator" - retraite-droits-acquis: "<0>Retirement: rights acquired in 2021<1><0>Basic + title: 'Self-employed: income simulator' + retraite-droits-acquis: + '<0>Retirement: rights acquired in 2021<1><0>Basic pension: <2><0> acquired quarters<1>Supplementary pension: <2><0>This simulator does not manage the acquired rights of supplementary pension for the liberal professions<3><0><0> - points acquired" + points acquired' shortname: Independent title: Income simulator for the self-employed is: meta: description: Calculate your corporate tax title: Corporate Tax Simulator - seo: <0>How is corporate tax calculated?<1>Corporate income tax applies to + seo: + <0>How is corporate tax calculated?<1>Corporate income tax applies to the profits made by corporations (SA, SAS, SASU, SARL, etc.) and on an optional basis for certain other kind of companies (EIRL, EURL, SNC, etc.).<2>It is calculated on the basis of the profits made in France @@ -1466,34 +1560,39 @@ pages: title: Income simulator for private practitioners pamc: meta: - description: Calculation of net income for CMAP professionals (physicians, + description: + Calculation of net income for CMAP professionals (physicians, dentists, midwives and paramedics) title: PAMC diet simulators shortname: PAMC - title: "PAMC: contribution and income simulators" + title: 'PAMC: contribution and income simulators' pharmacien: shortname: Pharmacist title: Income simulator for self-employed pharmacists print-info: date: This simulation was performed on - recover: You can find this simulation and other tools to help you create and + recover: + You can find this simulation and other tools to help you create and manage your business on <2>mon-entreprise.urssaf.fr. title: Would you like to recover this simulation? profession-libérale: meta: - description: Net Income Calculation for Self-Employed Persons in Liberal Income + description: + Net Income Calculation for Self-Employed Persons in Liberal Income Tax (IR, BNC) - title: "Liberal professions: the Urssaf simulator" + title: 'Liberal professions: the Urssaf simulator' shortname: Liberal profession title: Professional Income Simulator sage-femme: shortname: Midwife title: Income simulator for private midwives salarié: - alt-image1: Net salary (received by the employee) = Gross salary (written in the + alt-image1: + Net salary (received by the employee) = Gross salary (written in the employment contract) - employee contributions (pension, social security, etc.) - explication seo: <0>Calculate your net salary<1>During the job interview, + explication seo: + <0>Calculate your net salary<1>During the job interview, the employer usually offers a "gross" remuneration. The announced amount thus includes employee contributions, which are used to finance the employee's social protection and which are deducted from the "net" @@ -1517,19 +1616,22 @@ pages: not all taken into account by our simulator, you can find them on the <6>official portal. meta: - description: Calculation of net salary, net after tax and total employer cost in + description: + Calculation of net salary, net after tax and total employer cost in France. Many options are available (executive, internship, apprenticeship, overtime, etc.) - ogDescription: As an employee, calculate your net income after tax immediately + ogDescription: + As an employee, calculate your net income after tax immediately from the monthly or annual gross income. As an employee, estimate the total cost of hiring from gross. This simulator is developed with Urssaf experts, and it adapts the calculations to your situation (executive status, internship, apprenticeship, overtime, restaurant vouchers, mutual insurance, part-time work, collective agreement, etc.). - ogTitle: "Gross, net, net after-tax salary, total cost: the ultimate simulator - for employees and employers" - titre: "Gross / net salary: the Urssaf converter" + ogTitle: + 'Gross, net, net after-tax salary, total cost: the ultimate simulator + for employees and employers' + titre: 'Gross / net salary: the Urssaf converter' seo: <0>How is the net salary calculated?<1>At the job interview, the employer usually proposes a "gross" remuneration. The amount announced thus includes employee contributions, which are used to finance the @@ -1561,11 +1663,13 @@ pages: sasu: meta: description: Calculation of net salary from turnover + expenses and vice versa. - ogDescription: As an officer in a similar position, immediately calculate your + ogDescription: + As an officer in a similar position, immediately calculate your net income after tax from the total allocated to your compensation. - ogTitle: "SASU executive compensation: a simulator to find out your net salary" - titre: "SASU : income simulator for managers" - seo-explanation: "<0>How to calculate the salary of a SASU executive? <1>As + ogTitle: 'SASU executive compensation: a simulator to find out your net salary' + titre: 'SASU : income simulator for managers' + seo-explanation: + '<0>How to calculate the salary of a SASU executive? <1>As for a classic employee, the SASU <2>manager pays social security contributions on the remuneration he pays himself. The contributions are calculated in the same way as for the employee: they are broken down @@ -1577,18 +1681,19 @@ pages: bonuses.<3>However, the employee is entitled to the <2>ACRE reduction at the start of employment, under certain conditions.<4>You can use our simulator to calculate the <2>net - remuneration from a super-gross amount allocated to the executive's + remuneration from a super-gross amount allocated to the executive''s remuneration. To do this, simply enter the total amount allocated in the - \"total charged\" box. The simulation can then be refined by answering - the various questions." + "total charged" box. The simulation can then be refined by answering + the various questions.' shortname: SASU title: SASU Simulator titre: Revenue simulator for SAS(U) executive économie-collaborative: meta: - description: Airbnb, Drivy, Blablacar, Leboncoin... Find out how to be in order + description: + Airbnb, Drivy, Blablacar, Leboncoin... Find out how to be in order in your declarations - title: "Online platform income tax return: interactive guide" + title: 'Online platform income tax return: interactive guide' shortname: Legal status assistant par: per par an: per year @@ -1597,8 +1702,9 @@ payslip: disclaimer: It takes into account national law but not union negotiated rules. Lots of financial aids for your enterprise exist, explore them on <1>aides-entreprises.fr (French). - heures: "Hours worked per month: " - notice: This simulation helps you understand your French payslip, but it should + heures: 'Hours worked per month: ' + notice: + This simulation helps you understand your French payslip, but it should not be used as one. For further details, check <1>service-public.fr (French). repartition: Distribution of total amount @@ -1645,7 +1751,8 @@ responsabilité: An economic activity carried out by a single natural person in his or her own name. Less formalities, but more risks in the event of bankruptcy, because your personal assets can be put to use. <3>You cannot welcome new partners into a sole proprietorship. - intro: This choice determines your degree of responsibility and your ability to + intro: + This choice determines your degree of responsibility and your ability to welcome new partners in the future page: titre: Choose between Sole Proprietorship and Limited Liability Company in France @@ -1662,7 +1769,8 @@ select: selectionRégime: comparer: cta: Compare social schemes - description: The executive's social scheme has a very strong influence on the + description: + The executive's social scheme has a very strong influence on the level of social protection and the perceived income. To help you see more clearly and choose the plan that suits you best, we have designed a quick comparator. @@ -1671,18 +1779,21 @@ selectionRégime: titre: Social scheme selection titre: Which social scheme would you like to explore? warning: - artiste-auteur: This estimate is proposed for information only. It is based on + artiste-auteur: + This estimate is proposed for information only. It is based on the applicable regulatory elements and the elements that you have entered, but it does not take into account your entire situation. The actual amount of your contributions may therefore be different. - cfe: The simulator does not include the corporate property tax (CFE), which is + cfe: + The simulator does not include the corporate property tax (CFE), which is due from the second year of the fiscal year. Its amount varies greatly depending on the company's turnover and the company's domiciliation. <2>More info. plus: Read explanations sasu: Corporate income tax and dividend management are not yet implemented. titre: Before starting... - urssaf: The figures are indicative and do not replace the actual accounts of the + urssaf: + The figures are indicative and do not replace the actual accounts of the Urssaf, impots.gouv.fr, etc shareSimulation: banner: Generate a share link @@ -1696,20 +1807,26 @@ shareSimulation: navigatorShare: My Simulation My Company simulateurs: explanation: - CNAPL: It recovers contributions related to your retirement and disability/death + CNAPL: + It recovers contributions related to your retirement and disability/death plan. institutions: - cpam: As a health professional under agreement, you benefit from a part of your + cpam: + As a health professional under agreement, you benefit from a part of your contributions being covered by the Health Insurance. - dgfip: The Direction générale des finances publiques (DGFiP) is the body that + dgfip: + The Direction générale des finances publiques (DGFiP) is the body that collects income tax. <2>The amount calculated <2>takes into account the abatement of the micro-tax system. - notice acre: The amounts indicated above are calculated without taking into + notice acre: + The amounts indicated above are calculated without taking into account the ACRE start-up exemption - précompte-artiste-auteur: For your salary and wages income, these contributions + précompte-artiste-auteur: + For your salary and wages income, these contributions are "deducted", i.e. paid at source by the broadcaster. titre: Your partner institutions - urssaf: The Urssaf collects the contributions used to finance social security + urssaf: + The Urssaf collects the contributions used to finance social security (health insurance, family allowances, dependence). inversionFail: >- The amount entered results in an impossible result. This is due to a @@ -1718,21 +1835,26 @@ simulateurs: We invite you to try again by slightly modifying the amount entered (a few euros more for example). précision: - défaut: "Improve your simulation by answering the questions :" + défaut: 'Improve your simulation by answering the questions :' warning: - année-courante: The amount of the contributions is calculated for an income over + année-courante: + The amount of the contributions is calculated for an income over the year 2020. artiste-auteur: - "1": This estimate is provided for information purposes. It is based on the + '1': + This estimate is provided for information purposes. It is based on the applicable regulatory elements and the elements that you have entered, but it does not take into account your entire situation. The actual amount of your contributions may therefore be different. - "2": This simulator allows you to estimate the amount of your contributions + '2': + This simulator allows you to estimate the amount of your contributions based on your projected income. - auto-entrepreneur: " Self-entrepreneurs cannot deduct their expenses from their + auto-entrepreneur: + ' Self-entrepreneurs cannot deduct their expenses from their turnover. Therefore, <3>all costs related to the business must be - <3>netted out to obtain the income actually received." - cfe: The simulator does not include the business property tax (CFE), which is + <3>netted out to obtain the income actually received.' + cfe: + The simulator does not include the business property tax (CFE), which is due from the second year of the fiscal year. Its amount varies greatly depending on the company's turnover and domiciliation. <2>More information. @@ -1747,7 +1869,8 @@ simulateurs: societies or the micro-NBP scheme. sasu: Corporate income tax and dividend management are not yet implemented. titre: Before we start... - urssaf: The calculations are indicative and are not a substitute for the actual + urssaf: + The calculations are indicative and are not a substitute for the actual statements of Urssaf, impots.gouv.fr, or others. simulation-end: cta: Know the steps to take @@ -1757,7 +1880,7 @@ simulation-end: text: You have reached the most accurate estimate. title: No more questions left! site: - titleTemplate: "%s" + titleTemplate: '%s - My Company' statut du dirigeant: description: <0>This choice is important because it determines the social security regime and the social coverage of the manager. The amount and terms @@ -1804,19 +1927,21 @@ une de ces conditions: one of these applies Êtes vous satisfait de cet assistant ?: Are you satisfied with this assistant? à: to économieCollaborative: - WIP: <0>This assistant is under development. Do not hesitate to send us all + WIP: + <0>This assistant is under development. Do not hesitate to send us all your remarks, ideas, questions by clicking on the "Make a suggestion" button above. accueil: - contenu: <0>Do you have income from <2>online platforms (Airbnb, Abritel, + contenu: + <0>Do you have income from <2>online platforms (Airbnb, Abritel, Drivy, Blablacar, Leboncoin, etc.)? You must declare them in most cases. However, it can be difficult to find your way around <5><0>.<1>Follow this guide to find out in a few clicks how to be in order.<2>This income is automatically communicated by the platforms to the tax authorities and the Urssaf. question: What types of activity did you undertake? - réassurance: "PS: this tool is only there to inform you, no data will be - transmitted to the administrations" + réassurance: 'PS: this tool is only there to inform you, no data will be + transmitted to the administrations' titre: How to declare income from digital platforms? activité: choix: What are more precisely the activities carried out? @@ -1839,7 +1964,8 @@ une de ces conditions: one of these applies aucune: | <0>Nothing to do <1>You do not need to report your income for these activities. - entreprise: <0>With a company <1>If you already have a declared activity, + entreprise: + <0>With a company <1>If you already have a declared activity, you can add this income to the company's income. You will only have to check that its corporate purpose is compatible with the activities concerned (and change it if necessary). Otherwise, you will have to start @@ -1851,7 +1977,8 @@ une de ces conditions: one of these applies activities, you only need to report your income on your tax return. For more information, you can visit the <2>dedicated page on impots.gouv.fr. - pro: <0>Declare as a professional activity <1>Your income is considered as + pro: + <0>Declare as a professional activity <1>Your income is considered as professional income and is subject to social security contributions. In return, they entitle you to social benefits (pension, health insurance, maternity, etc.). diff --git a/site/source/locales/ui-fr.yaml b/site/source/locales/ui-fr.yaml index 24d5248d4..4d7c7ec54 100644 --- a/site/source/locales/ui-fr.yaml +++ b/site/source/locales/ui-fr.yaml @@ -16,6 +16,12 @@ Autres outils: Autres outils Cette commune n'existe pas: Cette commune n'existe pas Chercher dans la documentation: Chercher dans la documentation Commencer: Commencer +CompanySearchField: + ariaClearLabel: Effacer la recherche + description: "Le numéro Siret est un numéro de 14 chiffres unique pour chaque + entreprise. Ex : 40123778000127" + label: Nom de l'entreprise, SIREN ou SIRET + placeholder: Café de la gare ou 40123778000127 Continuer: Continuer Cotisations sociales: Cotisations sociales Crée le: Crée le @@ -45,7 +51,6 @@ Liste des statuts juridiques: Liste des statuts juridiques Mes réponses: Mes réponses Modifier: Modifier Montant de l'impôt sur les sociétés: Montant de l'impôt sur les sociétés -"Nom de l'entreprise ou SIREN ": "Nom de l'entreprise ou SIREN " Non: Non Oui: Oui Outils pour les développeurs: Outils pour les développeurs @@ -68,6 +73,7 @@ Prévisualisation: Prévisualisation Que cherchez-vous ?: Que cherchez-vous ? Quelques intégrations: Quelques intégrations Rechercher: Rechercher +Rechercher une entreprise: Rechercher une entreprise Ressources utiles: Ressources utiles Retour: Retour Retour à la création: Retour à la création @@ -129,6 +135,7 @@ après: et maladies professionnelles à payer.<7>En cas de code APE erroné, vous pouvez <2>demander une modification à l'INSEE. titre: Le code APE + entreprise: entreprise intro: "Une fois votre {{statutChoisi}} créée, vous recevez les informations suivantes :" kbis: @@ -318,6 +325,7 @@ embauche: titre: S'inscrire à un bureau de médecine du travail page: description: Toutes les démarches nécessaires à l'embauche de votre premier salarié. + titre: Les formalités pour embaucher pension: description: Trouver mon institution de prévoyance titre: Prendre contact avec l'institution de prévoyance complémentaire @@ -613,6 +621,7 @@ landing: à vis de l’administration afin que vous puissiez vous concentrer sur ce qui compte : votre activité." choice: + continue: Continuer avec l'entreprise create: body: Un accompagnement au choix du statut juridique et la liste complète des démarches de création @@ -623,10 +632,15 @@ landing: title: Gérer mon activité simulators: body: La liste exhaustive de tous les simulateurs disponibles sur le site. - title: Accéder aux simulateurs + title: Découvrir tous les simulateurs et assistants + outils: <0>Les outils à votre disposition<1>Nous mettons à votre disposition + des assistants et simulateurs pour vous aider à la gestion de votre + entreprise, anticiper les prélèvements et planifier votre trésorerie en + conséquence. + outils_cta: <0> Découvrir tous les simulateurs et assistants subtitle: Les ressources nécessaires pour développer votre activité, du statut juridique à l'embauche. - title: L'assistant officiel de l'entrepreneur + title: L'assistant officiel des entrepreneurs legalNotice: contact: content: <0>contact@mon-entreprise.beta.gouv.fr @@ -653,6 +667,7 @@ nextSteps: cta: Voir la documentation title: Intégrer le module web noresults: Aucun résultat ne correspond à cette recherche +ou: ou page: documentation: title: Documentation @@ -1370,6 +1385,8 @@ simulation-end: text: Vous pouvez maintenant concrétiser votre projet d'embauche. text: Vous avez maintenant accès à l'estimation la plus précise possible. title: Vous avez complété cette simulation +site: + titleTemplate: "%s - Mon-entreprise" statut du dirigeant: description: <0>Ce choix est important car il détermine le régime de sécurité sociale et la couverture sociale du dirigeant. Le montant et les modalités diff --git a/site/source/pages/Creer/AfterRegistration.tsx b/site/source/pages/Creer/AfterRegistration.tsx index 40b525674..5aaac66cc 100644 --- a/site/source/pages/Creer/AfterRegistration.tsx +++ b/site/source/pages/Creer/AfterRegistration.tsx @@ -35,7 +35,8 @@ export default function AfterRegistration() { {{ statutChoisi: isAutoentrepreneur ? t('auto-entreprise') - : statutChoisi || t(['après.entreprise', 'entreprise']), + : statutChoisi || + t('après.entreprise', { defaultValue: 'entreprise' }), }}{' '} créée, vous recevez les informations suivantes : diff --git a/site/source/pages/Gerer/Embaucher.tsx b/site/source/pages/Gerer/Embaucher.tsx index bc857ac79..e113d103b 100644 --- a/site/source/pages/Gerer/Embaucher.tsx +++ b/site/source/pages/Gerer/Embaucher.tsx @@ -28,7 +28,9 @@ function Embaucher({ onChecklistInitialization, onItemCheck }: EmbaucherProps) { - {t(['embauche.tâches.page.titre', 'Les formalités pour embaucher'])} + {t('embauche.tâches.page.titre', { + defaultValue: 'Les formalités pour embaucher', + })} { + const sitePaths = useContext(SitePathsContext) + + return ( + <> +

+ + Continuer avec l'entreprise + +

+ + + + + ) +} diff --git a/site/source/pages/Landing/Landing.css b/site/source/pages/Landing/Landing.css deleted file mode 100644 index 7c84b64da..000000000 --- a/site/source/pages/Landing/Landing.css +++ /dev/null @@ -1,55 +0,0 @@ -.landing-title { - margin-bottom: 1rem; - display: flex; - align-items: center; -} - -.landing-title__img { - align-self: flex-end; - margin-top: 2rem; - max-width: 19.5rem; - margin-left: 1.5rem; - margin-bottom: -3.5rem; -} -@media (min-width: 500px) { - .landing-title__logo { - display: none; - } -} - -@media (max-width: 900px) { - .landing-title__img { - margin: 0; - margin-bottom: -3.5rem; - } - .landing-header__brand-logo { - height: 4rem; - } - .landing-header__institutional-logo { - height: 3.5rem; - } - .landing-header { - justify-content: space-around; - } - .landing-header *:nth-child(3) { - order: -1; - } - .landing-header *:nth-child(2) { - display: none; - } - .landing-header__brand-logo { - margin-left: 1rem; - } -} -@media (max-width: 500px) { - .landing-title { - flex-direction: column; - text-align: center; - } - .landing-title__logo { - display: none; - } - .landing-title__img { - display: none; - } -} diff --git a/site/source/pages/Landing/Landing.tsx b/site/source/pages/Landing/Landing.tsx index 191a41b63..ee9a11298 100644 --- a/site/source/pages/Landing/Landing.tsx +++ b/site/source/pages/Landing/Landing.tsx @@ -2,37 +2,40 @@ import { Grid } from '@mui/material' import Footer from 'Components/layout/Footer/Footer' import Header from 'Components/layout/Header' import PageHeader from 'Components/PageHeader' -import Emoji from 'Components/utils/Emoji' import Meta from 'Components/utils/Meta' import { SitePathsContext } from 'Components/utils/SitePathsContext' -import { Card } from 'DesignSystem/card/Card' +import { Button } from 'DesignSystem/buttons' import { Container, Spacing } from 'DesignSystem/layout' import { H2 } from 'DesignSystem/typography/heading' import { Link } from 'DesignSystem/typography/link' import { Body, Intro } from 'DesignSystem/typography/paragraphs' import logoShare from 'Images/logo-share.png' import { useContext } from 'react' -import { Trans, useTranslation } from 'react-i18next' +import { Trans } from 'react-i18next' import { useSelector } from 'react-redux' import { RootState } from 'Reducers/rootReducer' import { TrackPage } from '../../ATInternetTracking' +import { SimulateurCard } from '../Simulateurs/Home' +import useSimulatorsData from '../Simulateurs/metadata' +import { ContinueWithCompany } from './ContinueWithCompany' import illustrationSvg from './illustration.svg' import illustration2Svg from './illustration2.svg' -import './Landing.css' +import SearchOrCreate from './SearchOrCreate' export default function Landing() { - const { t } = useTranslation() + const simulators = useSimulatorsData() const sitePaths = useContext(SitePathsContext) - const statutChoisi = useSelector( - (state: RootState) => state.inFranceApp.companyStatusChoice + const company = useSelector( + (state: RootState) => state.inFranceApp.existingCompany ) + return ( <>
@@ -40,7 +43,7 @@ export default function Landing() { - L'assistant officiel de l'entrepreneur + L'assistant officiel des entrepreneurs } picture={illustrationSvg} @@ -53,54 +56,50 @@ export default function Landing() { - theme.colors.bases.primary[500]}> + theme.colors.bases.primary[100]}> + {company && } + - - - } - title={t('landing.choice.create.title', 'Créer une entreprise')} - ctaLabel={statutChoisi ? t('Continuer') : t('Commencer')} - to={ - statutChoisi - ? sitePaths.créer[statutChoisi] - : sitePaths.créer.index - } - > - - Un accompagnement au choix du statut juridique et la liste - complète des démarches de création - - - - - } - title={t('landing.choice.manage.title', 'Gérer mon activité')} - ctaLabel={t('Commencer')} - to={sitePaths.gérer.index} - > - - Des outils personnalisés pour anticiper le montant des - cotisations sociales à payer et mieux gérer votre trésorerie. - - - - - } - title={t( - 'landing.choice.simulators.title', - 'Accéder aux simulateurs' - )} - ctaLabel={t('Découvrir')} + + + +

Les outils à votre disposition

+ + Nous mettons à votre disposition des assistants et simulateurs pour + vous aider à la gestion de votre entreprise, anticiper les + prélèvements et planifier votre trésorerie en conséquence. + +
+ + + + + + + + @@ -126,6 +125,7 @@ export default function Landing() {

Qui sommes-nous ?

+ Nous sommes une petite{' '} @@ -140,6 +140,7 @@ export default function Landing() { . + Nous avons développé ce site pour accompagner les créateurs d’entreprise dans le développement de leur activité. diff --git a/site/source/pages/Landing/SearchOrCreate.tsx b/site/source/pages/Landing/SearchOrCreate.tsx new file mode 100644 index 000000000..ccc834b7a --- /dev/null +++ b/site/source/pages/Landing/SearchOrCreate.tsx @@ -0,0 +1,75 @@ +import { Grid } from '@mui/material' +import { useSetEntreprise } from 'Actions/companyStatusActions' +import { Etablissement } from 'api/sirene' +import { CompanySearchField } from 'Components/CompanySearchField' +import Emoji from 'Components/utils/Emoji' +import { SitePathsContext } from 'Components/utils/SitePathsContext' +import { Button } from 'DesignSystem/buttons' +import { H3 } from 'DesignSystem/typography/heading' +import { GenericButtonOrLinkProps } from 'DesignSystem/typography/link' +import { useCallback, useContext } from 'react' +import { Trans } from 'react-i18next' +import { useSelector } from 'react-redux' +import { useHistory } from 'react-router-dom' +import { RootState } from 'Reducers/rootReducer' +import styled from 'styled-components' + +export default function SearchOrCreate() { + const sitePaths = useContext(SitePathsContext) + const statutChoisi = useSelector( + (state: RootState) => state.inFranceApp.companyStatusChoice + ) + const handleCompanySubmit = useHandleCompanySubmit() + + return ( + + +

+ Rechercher une entreprise{' '} + + ou{' '} + + + Créer une entreprise + {' '} + + + +

+
+ + + +
+ ) +} + +const CreateCompanyButton = styled(Button)` + margin-left: 0.25rem; + white-space: nowrap; + margin-top: 0.5rem; + display: inline-block; + width: auto; +` + +function useHandleCompanySubmit() { + const history = useHistory() + const sitePaths = useContext(SitePathsContext) + const setEntreprise = useSetEntreprise() + const handleCompanySubmit = useCallback( + (établissement: Etablissement) => { + setEntreprise(établissement.siren) + history.push(sitePaths.gérer.index) + }, + [history, setEntreprise, sitePaths] + ) + return handleCompanySubmit +} diff --git a/yarn.lock b/yarn.lock index b3353904b..920a1abda 100644 --- a/yarn.lock +++ b/yarn.lock @@ -164,6 +164,13 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" + integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + dependencies: + "@babel/types" "^7.10.4" + "@babel/helper-annotate-as-pure@^7.15.4", "@babel/helper-annotate-as-pure@^7.16.0": version "7.16.0" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz" @@ -1079,7 +1086,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.16.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.16.0" resolved "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz" integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== @@ -1207,7 +1214,7 @@ "@formatjs/intl-localematcher@0.2.21": version "0.2.21" - resolved "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.21.tgz" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.2.21.tgz#39ef33d701fe8084f3d693cd3ff7cbe03cdd3a49" integrity sha512-JTJeLiNwexN4Gy0cMxoUPvJbKhXdnSuo5jPrDafEZpnDWlJ5VDYta8zUVVozO/pwzEmFVHEUpgiEDj+39L4oMg== dependencies: tslib "^2.1.0" @@ -1945,6 +1952,91 @@ dependencies: "@types/yoga-layout" "^1.9.3" +"@react-spring/animated@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.3.1.tgz#ffc4706121e8406efeaeacb407b42b5022943b46" + integrity sha512-23YaERZ++BwZ8F8PxPFqrpOwp/JZun1Pj6aHZtPAU42j5LycBRasT9XMw7Eyr7zNFhT+rl3R3wFfd4WX6Ax+UA== + dependencies: + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/core@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.3.1.tgz#b98e1dca1eb4871dec75fdab350327e8a5222865" + integrity sha512-8rmfmEHLHGtF1CUiXRn64YJqsXNxv2cGX8oNnBnsuoE33c48Zc34t2VIMB4R9q5zwIUCvDBGfiEenA8ZAPxqOQ== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/konva@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/konva/-/konva-9.3.1.tgz#7a915c1c912a81dc27d1a1bc31eb47c0a2a0c643" + integrity sha512-woG2DeDcUlz5hB8g9pA/tyUWU6dMrAzyUsNiBWVCyI9UqKA7CUKjz+ODOUi+hS++3Kz7kZSr3u0zzHHfxvoTPQ== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/core" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/native@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/native/-/native-9.3.1.tgz#e1ac9d04d833b8d97e2d63630c4204f71915a29a" + integrity sha512-NAC1wHIUvy1umCVQRxcS+31Dmr9NszBY06sHy3jR8/HVuKNtaDUARVF3AYL/HfbIy4m6yR3tcIkM2NQ0SO+rZA== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/core" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/rafz@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.3.1.tgz#8dd6a598ffea487252b75d05d199e4aca5ea9d5e" + integrity sha512-fEBMCarGVl+/2kdO+g6Zig4F+3ymwmcGN8S71gb1c7Cbbxb87kviPz8EhshfIHoiLeJPGlqwcuGbxNmZbBamvA== + +"@react-spring/shared@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.3.1.tgz#e7f22a4b8f5fea4491fa6a24c108db5abd19ddba" + integrity sha512-jhPpxzURGo6Nty90ex1lkxmZae7w/VAbnGmb/nXcYoZwSoNR+W2aAd00iXsh2ZGz6MgoJOsc495JeG3uC7Am8A== + dependencies: + "@react-spring/rafz" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/three@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.3.1.tgz#91a50851639c5a88fed8f76b4e25ff388d2b24e7" + integrity sha512-40iRIX2DrY+a81hIliOog6TMg/ZAtHGeZr95r0vKAsl+iX1g9Hs8XCS4wTeQIUgydZpbpShk/JL6mkcstEfBdw== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/core" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/types@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.3.1.tgz#20f392ecad15a1ea6c0865ffe86ca5016c05a278" + integrity sha512-W/YMJMX35XgGGzX0gKORBTwnvQ+1loDOFN3XlZkW5fgpEY+7VkRUpPyqPWXQr3n6lHrsLmHIGdpznqZi54ACTQ== + +"@react-spring/web@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.3.1.tgz#5b377ba7ad52e746c2b59e2738c021de3f219d0b" + integrity sha512-sisZIgFGva/Z+xKWPSfXpukF0AP3kR9ALTxlHL87fVotMUCJX5vtH/YlVcywToEFwTHKt3MpI5Wy2M+vgVEeaw== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/core" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + +"@react-spring/zdog@~9.3.0": + version "9.3.1" + resolved "https://registry.yarnpkg.com/@react-spring/zdog/-/zdog-9.3.1.tgz#70fccd80c35248217de6252c4c2ffca16b4cff2f" + integrity sha512-QflA/fII9zWe9CSOA8QGSLMjUwyrtD1TX6YVzUSn/nlr2f7PlZPijdpdu9Cvdirgss472cUS7cRIUfll0TepqA== + dependencies: + "@react-spring/animated" "~9.3.0" + "@react-spring/core" "~9.3.0" + "@react-spring/shared" "~9.3.0" + "@react-spring/types" "~9.3.0" + "@react-stately/checkbox@^3.0.3": version "3.0.3" resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.0.3.tgz" @@ -3827,12 +3919,12 @@ babel-plugin-polyfill-regenerator@^0.3.0: "@babel/helper-define-polyfill-provider" "^0.3.0" "babel-plugin-styled-components@>= 1.12.0": - version "2.0.2" - resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.2.tgz" - integrity sha512-7eG5NE8rChnNTDxa6LQfynwgHTVOYYaHJbUYSlOhk8QBXIQiMBKq4gyfHBBKPrxUcVBXVJL61ihduCpCQbuNbw== + version "1.13.2" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.13.2.tgz#ebe0e6deff51d7f93fceda1819e9b96aeb88278d" + integrity sha512-Vb1R3d4g+MUfPQPVDMCGjm3cDocJEUTR7Xq7QS95JWWeksN1wdFRYpD2kulDgI3Huuaf1CZd+NK4KQmqUFh5dA== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-module-imports" "^7.0.0" babel-plugin-syntax-jsx "^6.18.0" lodash "^4.17.11" @@ -4733,6 +4825,15 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +clipboard@^2.0.0: + version "2.0.8" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" + integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + clipboardy@1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-1.2.3.tgz" @@ -4913,6 +5014,11 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + commander@2.15.1: version "2.15.1" resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" @@ -5549,6 +5655,11 @@ de-indent@^1.0.2: resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= +debounce@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" @@ -5682,6 +5793,11 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + delegates@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" @@ -6731,6 +6847,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fault@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz" @@ -6951,6 +7074,11 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +format@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" + integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" @@ -7363,6 +7491,13 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= + dependencies: + delegate "^3.1.2" + graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz" @@ -7513,6 +7648,21 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hastscript@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" + integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== + dependencies: + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + he@1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/he/-/he-1.1.1.tgz" @@ -7538,6 +7688,11 @@ heimdalljs@^0.2.6: dependencies: rsvp "~3.2.1" +highlight.js@~9.13.0: + version "9.13.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" + integrity sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A== + history@^4.9.0: version "4.10.1" resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" @@ -9467,6 +9622,14 @@ lower-case@^1.1.1: resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= +lowlight@~1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.11.0.tgz#1304d83005126d4e8b1dc0f07981e9b689ec2efc" + integrity sha512-xrGGN6XLL7MbTMdPD6NfWPwY43SNkjf/d0mecSx/CW36fUZTjRHEq0/Cdug3TWKtRXLWi7iMl1eP0olYxj/a4A== + dependencies: + fault "^1.0.2" + highlight.js "~9.13.0" + lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.5" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" @@ -10521,7 +10684,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-entities@^1.1.0: +parse-entities@^1.1.0, parse-entities@^1.1.2: version "1.2.2" resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz" integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg== @@ -10620,7 +10783,7 @@ path-parse@^1.0.6: path-posix@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8= path-to-regexp@0.1.7: @@ -11150,6 +11313,18 @@ prettycli@^1.4.3: dependencies: chalk "2.1.0" +prismjs@^1.8.4: + version "1.25.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" + integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== + +prismjs@~1.17.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be" + integrity sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q== + optionalDependencies: + clipboard "^2.0.0" + private@~0.1.5: version "0.1.8" resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" @@ -11202,7 +11377,7 @@ prop-types-exact@^1.2.0: object.assign "^4.1.0" reflect.ownkeys "^0.2.0" -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -11211,6 +11386,13 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, object-assign "^4.1.1" react-is "^16.8.1" +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" @@ -11700,13 +11882,28 @@ react-smooth@^1.0.5: raf "^3.4.0" react-transition-group "^2.5.0" -react-spring@=8.0.27: - version "8.0.27" - resolved "https://registry.npmjs.org/react-spring/-/react-spring-8.0.27.tgz" - integrity sha512-nDpWBe3ZVezukNRandTeLSPcwwTMjNVu1IDq9qA/AMiUqHuRN4BeSWvKr3eIxxg1vtiYiOLy4FqdfCP5IoP77g== +react-spring@^9.3.1: + version "9.3.2" + resolved "https://registry.yarnpkg.com/react-spring/-/react-spring-9.3.2.tgz#1456ef1ab1a3997c6c39693a9fd18cfd46c92930" + integrity sha512-LMFgjvTJVg2ltthzgJcZ7siOdRig7L8wJZIHrc7p6ss4AaJ446xHzm9L2ZQha1ZC9QVY8/e6XfLhMTFAG6dtjw== + dependencies: + "@react-spring/core" "~9.3.0" + "@react-spring/konva" "~9.3.0" + "@react-spring/native" "~9.3.0" + "@react-spring/three" "~9.3.0" + "@react-spring/web" "~9.3.0" + "@react-spring/zdog" "~9.3.0" + +react-syntax-highlighter@^10.1.1: + version "10.3.5" + resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-10.3.5.tgz#3b3e2d1eba92fb7988c3b50d22d2c74ae0263fdd" + integrity sha512-KR4YE7Q91bHEhvIxuvs/J3tJWfxTyBAAMS4fcMOR9h0C6SoCZIr1OUkVamHOqHMDEck4tdS9gp0D/vlAyPLftA== dependencies: "@babel/runtime" "^7.3.1" - prop-types "^15.5.8" + highlight.js "~9.13.0" + lowlight "~1.11.0" + prismjs "^1.8.4" + refractor "^2.4.1" react-test-renderer@^16.0.0-0: version "16.14.0" @@ -11748,6 +11945,20 @@ react-transition-group@^4.4.2: loose-envify "^1.4.0" prop-types "^15.6.2" +react-use-measure@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.0.4.tgz#cb675b36eaeaf3681b94d5f5e08b2a1e081fedc9" + integrity sha512-7K2HIGaPMl3Q9ZQiEVjen3tRXl4UDda8LiTPy/QxP8dP2rl5gPBhf7mMH6MVjjRNv3loU7sNzey/ycPNnHVTxQ== + dependencies: + debounce "^1.2.0" + +react-useportal@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/react-useportal/-/react-useportal-1.0.13.tgz#abfc29f8128756cd7382bff7c81a4f446b792199" + integrity sha512-83KpNTXUIHnRVTLeMberIblCtssvRSKCPnG/xT9NW60gDYfU13pQBNQKCVUF8MBK+7LnCQ/ZrOuXl8Mp+iXdXA== + dependencies: + use-ssr "^1.0.19" + react@^17.0.0: version "17.0.1" resolved "https://registry.npmjs.org/react/-/react-17.0.1.tgz" @@ -11868,6 +12079,15 @@ reflect.ownkeys@^0.2.0: resolved "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz" integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA= +refractor@^2.4.1: + version "2.10.1" + resolved "https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e" + integrity sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw== + dependencies: + hastscript "^5.0.0" + parse-entities "^1.1.2" + prismjs "~1.17.0" + regenerate-unicode-properties@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz" @@ -12415,6 +12635,11 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= + semver@7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" @@ -12759,6 +12984,11 @@ sourcemap-codec@^1.4.4: resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz" @@ -13076,6 +13306,22 @@ styled-components@^5.1.0: shallowequal "^1.1.0" supports-color "^5.5.0" +styled-components@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.3.1.tgz#8a86dcd31bff7049c2ed408bae36fa23f03f071a" + integrity sha512-JThv2JRzyH0NOIURrk9iskdxMSAAtCfj/b2Sf1WJaCUsloQkblepy1jaCLX/bYE+mhYo3unmwVSI9I5d9ncSiQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/traverse" "^7.4.5" + "@emotion/is-prop-valid" "^0.8.8" + "@emotion/stylis" "^0.8.4" + "@emotion/unitless" "^0.7.4" + babel-plugin-styled-components ">= 1.12.0" + css-to-react-native "^3.0.0" + hoist-non-react-statics "^3.0.0" + shallowequal "^1.1.0" + supports-color "^5.5.0" + supports-color@5.4.0: version "5.4.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" @@ -13380,6 +13626,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz" @@ -13904,6 +14155,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-ssr@^1.0.19: + version "1.0.24" + resolved "https://registry.yarnpkg.com/use-ssr/-/use-ssr-1.0.24.tgz#213a3df58f5ab9268e6fe1a57ad0a9de91e514d1" + integrity sha512-0MFps7ezL57/3o0yl4CvrHLlp9z20n1rQZV/lSRz7if+TUoM6POU1XdOvEjIgjgKeIhTEye1U0khrIYWCTWw4g== + use@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz"