@troychaplin/parlour-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/_shared/client-CLAcY4nN.cjs +1 -0
- package/dist/_shared/client-CsCPbj42.mjs +93 -0
- package/dist/_shared/rolldown-runtime-BocRIvOZ.cjs +1 -0
- package/dist/_shared/shared-B07rlYN8.cjs +1 -0
- package/dist/_shared/shared-DZTw1JIu.mjs +400 -0
- package/dist/components/Article/Article.d.ts +7 -0
- package/dist/components/Article/Article.d.ts.map +1 -0
- package/dist/components/Article/index.cjs +1 -0
- package/dist/components/Article/index.d.ts +9 -0
- package/dist/components/Article/index.d.ts.map +1 -0
- package/dist/components/Article/index.mjs +6 -0
- package/dist/components/Aside/Aside.d.ts +9 -0
- package/dist/components/Aside/Aside.d.ts.map +1 -0
- package/dist/components/Aside/index.cjs +1 -0
- package/dist/components/Aside/index.d.ts +12 -0
- package/dist/components/Aside/index.d.ts.map +1 -0
- package/dist/components/Aside/index.mjs +22 -0
- package/dist/components/Aside/styles.css +3 -0
- package/dist/components/Aside/styles.scss +3 -0
- package/dist/components/Body/Body.d.ts +7 -0
- package/dist/components/Body/Body.d.ts.map +1 -0
- package/dist/components/Body/index.cjs +1 -0
- package/dist/components/Body/index.d.ts +9 -0
- package/dist/components/Body/index.d.ts.map +1 -0
- package/dist/components/Body/index.mjs +9 -0
- package/dist/components/Button/Button.d.ts +24 -0
- package/dist/components/Button/Button.d.ts.map +1 -0
- package/dist/components/Button/index.cjs +1 -0
- package/dist/components/Button/index.d.ts +35 -0
- package/dist/components/Button/index.d.ts.map +1 -0
- package/dist/components/Button/index.mjs +2 -0
- package/dist/components/Button/styles.css +120 -0
- package/dist/components/Button/styles.scss +120 -0
- package/dist/components/ButtonGroup/ButtonGroup.d.ts +10 -0
- package/dist/components/ButtonGroup/ButtonGroup.d.ts.map +1 -0
- package/dist/components/ButtonGroup/index.cjs +1 -0
- package/dist/components/ButtonGroup/index.d.ts +17 -0
- package/dist/components/ButtonGroup/index.d.ts.map +1 -0
- package/dist/components/ButtonGroup/index.mjs +2 -0
- package/dist/components/ButtonGroup/styles.css +22 -0
- package/dist/components/ButtonGroup/styles.scss +22 -0
- package/dist/components/Card/Card.d.ts +16 -0
- package/dist/components/Card/Card.d.ts.map +1 -0
- package/dist/components/Card/index.cjs +1 -0
- package/dist/components/Card/index.d.ts +48 -0
- package/dist/components/Card/index.d.ts.map +1 -0
- package/dist/components/Card/index.mjs +21 -0
- package/dist/components/Card/styles.css +133 -0
- package/dist/components/Card/styles.scss +133 -0
- package/dist/components/CodeBlock/CodeBlock.d.ts +12 -0
- package/dist/components/CodeBlock/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock/index.cjs +1 -0
- package/dist/components/CodeBlock/index.d.ts +29 -0
- package/dist/components/CodeBlock/index.d.ts.map +1 -0
- package/dist/components/CodeBlock/index.mjs +20 -0
- package/dist/components/CodeBlock/styles.css +53 -0
- package/dist/components/CodeBlock/styles.scss +53 -0
- package/dist/components/Column/Column.d.ts +23 -0
- package/dist/components/Column/Column.d.ts.map +1 -0
- package/dist/components/Column/ColumnContent.d.ts +10 -0
- package/dist/components/Column/ColumnContent.d.ts.map +1 -0
- package/dist/components/Column/index.cjs +1 -0
- package/dist/components/Column/index.d.ts +33 -0
- package/dist/components/Column/index.d.ts.map +1 -0
- package/dist/components/Column/index.mjs +21 -0
- package/dist/components/Column/styles.css +74 -0
- package/dist/components/Column/styles.scss +74 -0
- package/dist/components/Container/Container.d.ts +16 -0
- package/dist/components/Container/Container.d.ts.map +1 -0
- package/dist/components/Container/index.cjs +1 -0
- package/dist/components/Container/index.d.ts +51 -0
- package/dist/components/Container/index.d.ts.map +1 -0
- package/dist/components/Container/index.mjs +2 -0
- package/dist/components/Container/styles.css +126 -0
- package/dist/components/Container/styles.scss +126 -0
- package/dist/components/Figure/Figure.d.ts +12 -0
- package/dist/components/Figure/Figure.d.ts.map +1 -0
- package/dist/components/Figure/index.cjs +1 -0
- package/dist/components/Figure/index.d.ts +14 -0
- package/dist/components/Figure/index.d.ts.map +1 -0
- package/dist/components/Figure/index.mjs +23 -0
- package/dist/components/Figure/styles.css +78 -0
- package/dist/components/Figure/styles.scss +78 -0
- package/dist/components/FlexGroup/FlexGroup.d.ts +21 -0
- package/dist/components/FlexGroup/FlexGroup.d.ts.map +1 -0
- package/dist/components/FlexGroup/index.cjs +1 -0
- package/dist/components/FlexGroup/index.d.ts +69 -0
- package/dist/components/FlexGroup/index.d.ts.map +1 -0
- package/dist/components/FlexGroup/index.mjs +2 -0
- package/dist/components/FlexGroup/styles.css +197 -0
- package/dist/components/FlexGroup/styles.scss +197 -0
- package/dist/components/GridGroup/GridGroup.d.ts +16 -0
- package/dist/components/GridGroup/GridGroup.d.ts.map +1 -0
- package/dist/components/GridGroup/index.cjs +1 -0
- package/dist/components/GridGroup/index.d.ts +46 -0
- package/dist/components/GridGroup/index.d.ts.map +1 -0
- package/dist/components/GridGroup/index.mjs +22 -0
- package/dist/components/GridGroup/styles.css +144 -0
- package/dist/components/GridGroup/styles.scss +144 -0
- package/dist/components/Hero/Hero.d.ts +7 -0
- package/dist/components/Hero/Hero.d.ts.map +1 -0
- package/dist/components/Hero/index.cjs +1 -0
- package/dist/components/Hero/index.d.ts +9 -0
- package/dist/components/Hero/index.d.ts.map +1 -0
- package/dist/components/Hero/index.mjs +23 -0
- package/dist/components/Hero/styles.css +27 -0
- package/dist/components/Hero/styles.scss +27 -0
- package/dist/components/HeroHeader/HeroHeader.d.ts +11 -0
- package/dist/components/HeroHeader/HeroHeader.d.ts.map +1 -0
- package/dist/components/HeroHeader/index.cjs +1 -0
- package/dist/components/HeroHeader/index.d.ts +14 -0
- package/dist/components/HeroHeader/index.d.ts.map +1 -0
- package/dist/components/HeroHeader/index.mjs +30 -0
- package/dist/components/HeroHeader/styles.css +39 -0
- package/dist/components/HeroHeader/styles.scss +39 -0
- package/dist/components/InfoBar/InfoBar.d.ts +8 -0
- package/dist/components/InfoBar/InfoBar.d.ts.map +1 -0
- package/dist/components/InfoBar/index.cjs +1 -0
- package/dist/components/InfoBar/index.d.ts +10 -0
- package/dist/components/InfoBar/index.d.ts.map +1 -0
- package/dist/components/InfoBar/index.mjs +44 -0
- package/dist/components/InfoBar/styles.css +11 -0
- package/dist/components/InfoBar/styles.scss +11 -0
- package/dist/components/LinkProvider/LinkContext.d.ts +4 -0
- package/dist/components/LinkProvider/LinkContext.d.ts.map +1 -0
- package/dist/components/LinkProvider/index.cjs +1 -0
- package/dist/components/LinkProvider/index.d.ts +16 -0
- package/dist/components/LinkProvider/index.d.ts.map +1 -0
- package/dist/components/LinkProvider/index.mjs +11 -0
- package/dist/components/LinkProvider/useLinkContext.d.ts +2 -0
- package/dist/components/LinkProvider/useLinkContext.d.ts.map +1 -0
- package/dist/components/Main/Main.d.ts +8 -0
- package/dist/components/Main/Main.d.ts.map +1 -0
- package/dist/components/Main/index.cjs +1 -0
- package/dist/components/Main/index.d.ts +10 -0
- package/dist/components/Main/index.d.ts.map +1 -0
- package/dist/components/Main/index.mjs +20 -0
- package/dist/components/Main/styles.css +19 -0
- package/dist/components/Main/styles.scss +19 -0
- package/dist/components/SectionHeader/SectionHeader.d.ts +9 -0
- package/dist/components/SectionHeader/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader/index.cjs +1 -0
- package/dist/components/SectionHeader/index.d.ts +12 -0
- package/dist/components/SectionHeader/index.d.ts.map +1 -0
- package/dist/components/SectionHeader/index.mjs +19 -0
- package/dist/components/SectionHeader/styles.css +29 -0
- package/dist/components/SectionHeader/styles.scss +29 -0
- package/dist/components/SiteHeader/SiteHeader.d.ts +9 -0
- package/dist/components/SiteHeader/SiteHeader.d.ts.map +1 -0
- package/dist/components/SiteHeader/index.cjs +1 -0
- package/dist/components/SiteHeader/index.d.ts +11 -0
- package/dist/components/SiteHeader/index.d.ts.map +1 -0
- package/dist/components/SiteHeader/index.mjs +73 -0
- package/dist/components/SiteHeader/styles.css +47 -0
- package/dist/components/SiteHeader/styles.scss +47 -0
- package/dist/components/_shared/Button-CAFrgdq8.mjs +28 -0
- package/dist/components/_shared/Button-CQIUEu-m.cjs +1 -0
- package/dist/components/_shared/ButtonGroup-B0V_8y-2.mjs +9 -0
- package/dist/components/_shared/ButtonGroup-ChqwMTps.cjs +1 -0
- package/dist/components/_shared/Container-Bl4f1ZwJ.cjs +1 -0
- package/dist/components/_shared/Container-OGjfScEb.mjs +26 -0
- package/dist/components/_shared/FlexGroup-CgPbyEha.cjs +1 -0
- package/dist/components/_shared/FlexGroup-CnOrx2MF.mjs +24 -0
- package/dist/components/_shared/parlour-tokens-BT0frVnY.cjs +1 -0
- package/dist/components/_shared/parlour-tokens-CHt4gBUd.mjs +245 -0
- package/dist/components/_shared/propClasses-CLbmpfVJ.cjs +1 -0
- package/dist/components/_shared/propClasses-R9s_eOfA.mjs +40 -0
- package/dist/components/_shared/rolldown-runtime-BocRIvOZ.cjs +1 -0
- package/dist/components/_shared/useLinkContext-CJko6HGf.mjs +6 -0
- package/dist/components/_shared/useLinkContext-DwwV1iqK.cjs +1 -0
- package/dist/components/tokens/index.cjs +1 -0
- package/dist/components/tokens/index.d.ts +5 -0
- package/dist/components/tokens/index.d.ts.map +1 -0
- package/dist/components/tokens/index.mjs +2 -0
- package/dist/data/ArticleData.d.ts +2 -0
- package/dist/data/ArticleData.d.ts.map +1 -0
- package/dist/data/CodeData.d.ts +3 -0
- package/dist/data/CodeData.d.ts.map +1 -0
- package/dist/data/ImageData.d.ts +5 -0
- package/dist/data/ImageData.d.ts.map +1 -0
- package/dist/data/NewsData.d.ts +11 -0
- package/dist/data/NewsData.d.ts.map +1 -0
- package/dist/data/SampleContent.d.ts +9 -0
- package/dist/data/SampleContent.d.ts.map +1 -0
- package/dist/data-images/attend-1-thumb.jpg +0 -0
- package/dist/data-images/attend-2-thumb.jpg +0 -0
- package/dist/data-images/attend-3-thumb.jpg +0 -0
- package/dist/data-images/attend-4-thumb.jpg +0 -0
- package/dist/data-images/event-1-thumb.jpg +0 -0
- package/dist/data-images/event-2-thumb.jpg +0 -0
- package/dist/data-images/event-3-thumb.jpg +0 -0
- package/dist/data-images/event-4-thumb.jpg +0 -0
- package/dist/data-images/story-1-thumb.jpg +0 -0
- package/dist/data-images/story-2-thumb.jpg +0 -0
- package/dist/data-images/story-3-thumb.jpg +0 -0
- package/dist/data-images/story-4-thumb.jpg +0 -0
- package/dist/docs/stylebook/components/BorderRadiusSamples.d.ts +7 -0
- package/dist/docs/stylebook/components/BorderRadiusSamples.d.ts.map +1 -0
- package/dist/docs/stylebook/components/ColorSwatches.d.ts +9 -0
- package/dist/docs/stylebook/components/ColorSwatches.d.ts.map +1 -0
- package/dist/docs/stylebook/components/ShadowSamples.d.ts +7 -0
- package/dist/docs/stylebook/components/ShadowSamples.d.ts.map +1 -0
- package/dist/docs/stylebook/components/SpacingScale.d.ts +8 -0
- package/dist/docs/stylebook/components/SpacingScale.d.ts.map +1 -0
- package/dist/docs/stylebook/components/TypographyScale.d.ts +23 -0
- package/dist/docs/stylebook/components/TypographyScale.d.ts.map +1 -0
- package/dist/fonts/inter-tight/inter-tight-variable-italic.woff2 +0 -0
- package/dist/fonts/inter-tight/inter-tight-variable-normal.woff2 +0 -0
- package/dist/fonts/jetbrains-mono/jetbrains-mono-variable-italic.woff2 +0 -0
- package/dist/fonts/jetbrains-mono/jetbrains-mono-variable-normal.woff2 +0 -0
- package/dist/fonts/source-serif-4/source-serif-4-variable-italic.woff2 +0 -0
- package/dist/fonts/source-serif-4/source-serif-4-variable-normal.woff2 +0 -0
- package/dist/fonts.css +43 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +3 -0
- package/dist/sample-imgs/event-img.jpg +0 -0
- package/dist/sample-imgs/news-img.jpg +0 -0
- package/dist/sample-imgs/page-img.jpg +0 -0
- package/dist/sample-imgs/people-img.jpg +0 -0
- package/dist/style.css +43 -0
- package/dist/styles/_parlour-variables.scss +83 -0
- package/dist/styles/c2b/parlour-tokens.d.ts +19 -0
- package/dist/styles/parlour-base-styles.css +72 -0
- package/dist/styles/parlour-base-styles.scss +72 -0
- package/dist/styles/parlour-layout.css +50 -0
- package/dist/styles/parlour-layout.scss +50 -0
- package/dist/styles/parlour-tokens.css +129 -0
- package/dist/styles/parlour-tokens.d.ts +19 -0
- package/dist/styles/parlour-tokens.js +148 -0
- package/dist/styles/parlour-tokens.scss +129 -0
- package/dist/styles/parlour-typography.css +29 -0
- package/dist/styles/parlour-typography.scss +29 -0
- package/dist/utils/propClasses.d.ts +101 -0
- package/dist/utils/propClasses.d.ts.map +1 -0
- package/dist/wordpress/block-theme.css +157 -0
- package/dist/wordpress/hybrid-theme.css +324 -0
- package/dist/wordpress/integrate.php +139 -0
- package/dist/wordpress/theme-parlour.json +581 -0
- package/package.json +154 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Troy Chaplin
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
# Parlour
|
|
2
|
+
|
|
3
|
+
**A palette cleanser for React and WordPress.**
|
|
4
|
+
|
|
5
|
+
A token-first UI kit for React and WordPress. One set of tokens, every flavour.
|
|
6
|
+
|
|
7
|
+
Formerly Octave Design System.
|
|
8
|
+
|
|
9
|
+
Browse the components and tokens in the [live Storybook](https://troychaplin.github.io/parlour-ui/).
|
|
10
|
+
|
|
11
|
+
## Why Parlour
|
|
12
|
+
|
|
13
|
+
- **One source of truth, two ecosystems.**
|
|
14
|
+
[`@troychaplin/component2block`](https://www.npmjs.com/package/@troychaplin/component2block)
|
|
15
|
+
compiles `c2b.config.json` into CSS custom properties (`--parlour--*`), SCSS
|
|
16
|
+
variables, base element styles, and a WordPress `theme.json` with matching editor
|
|
17
|
+
styles. A React app and the WordPress Site Editor render the same design language
|
|
18
|
+
because they read the same tokens — no parallel stylesheet to keep in sync by hand.
|
|
19
|
+
- **Fluid by default.** All 16 type steps are `clamp()` values that scale with the
|
|
20
|
+
viewport, and the spacing scale goes fluid from `small` upward. Responsive
|
|
21
|
+
typography without a stack of breakpoints.
|
|
22
|
+
- **No runtime, no lock-in.** Plain SCSS and CSS custom properties — no Tailwind, no
|
|
23
|
+
CSS-in-JS, no provider to wrap your tree in. Per-component CSS is exported
|
|
24
|
+
individually, so a WordPress block can ship only the styles it actually uses.
|
|
25
|
+
- **Accessibility is a build failure.** Every Storybook story runs through
|
|
26
|
+
[axe](https://github.com/dequelabs/axe-core) at the `error` threshold, on every pull
|
|
27
|
+
request and on pre-push. A violation blocks the merge — it isn't a warning someone
|
|
28
|
+
triages later.
|
|
29
|
+
- **Deliberately small.** Budgeted at 25 kB for the JS bundle and 7 kB for the
|
|
30
|
+
stylesheet, brotli-compressed. `pnpm size` checks both.
|
|
31
|
+
|
|
32
|
+
> **Status:** Parlour is early-stage and actively being rebuilt. The token pipeline,
|
|
33
|
+
> build, and accessibility tooling are solid; the component catalogue is small and
|
|
34
|
+
> growing. See the [changelog](CHANGELOG.mdx) for what has landed.
|
|
35
|
+
|
|
36
|
+
Built with React 18 & 19, TypeScript 6, Vite 8, Storybook 10, and SCSS.
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm install @troychaplin/parlour-ui
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
React and React DOM 18 or 19 are peer dependencies.
|
|
45
|
+
|
|
46
|
+
### React apps
|
|
47
|
+
|
|
48
|
+
Import the stylesheet once, where your app starts:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import '@troychaplin/parlour-ui/styles.css';
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Then use the components:
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
import { Button, Container, Main } from '@troychaplin/parlour-ui';
|
|
58
|
+
|
|
59
|
+
export function Page() {
|
|
60
|
+
return (
|
|
61
|
+
<Main>
|
|
62
|
+
<Container>
|
|
63
|
+
<h1>Hello, Parlour</h1>
|
|
64
|
+
<Button text="Get started" href="/start" />
|
|
65
|
+
</Container>
|
|
66
|
+
</Main>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`styles.css` has everything: the design tokens, base element styles, layout classes, every
|
|
72
|
+
component's CSS, and the `@font-face` rules for Inter Tight, Source Serif 4 and JetBrains Mono.
|
|
73
|
+
The font files ship with the package, and your bundler picks them up from the stylesheet. The
|
|
74
|
+
components don't import any CSS themselves, so this import is required.
|
|
75
|
+
|
|
76
|
+
#### Router links
|
|
77
|
+
|
|
78
|
+
`Button` with an `href`, and `SiteHeader`, render plain `<a>` links unless you wrap the app in
|
|
79
|
+
`LinkProvider` with your router's link component. That component receives standard anchor props,
|
|
80
|
+
including `href`:
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
import { LinkProvider } from '@troychaplin/parlour-ui';
|
|
84
|
+
|
|
85
|
+
<LinkProvider component={Link}>
|
|
86
|
+
<App />
|
|
87
|
+
</LinkProvider>;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Next.js's `Link` takes `href` as it is. React Router's `Link` expects `to`, so pass a wrapper
|
|
91
|
+
instead: `({ href = '', ...props }) => <Link to={href} {...props} />`.
|
|
92
|
+
|
|
93
|
+
#### Next.js App Router
|
|
94
|
+
|
|
95
|
+
Parlour's components work in Server Components. `Button`, `SiteHeader` and `LinkProvider` use
|
|
96
|
+
React context, so they're marked `'use client'` and render as Client Components; every other
|
|
97
|
+
component renders on the server. A Server Component can't pass a function such as Next.js's `Link`
|
|
98
|
+
to a Client Component, so set up `LinkProvider` in a client providers file:
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
// app/providers.tsx
|
|
102
|
+
'use client';
|
|
103
|
+
|
|
104
|
+
import Link from 'next/link';
|
|
105
|
+
import { LinkProvider } from '@troychaplin/parlour-ui';
|
|
106
|
+
|
|
107
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
108
|
+
return <LinkProvider component={Link}>{children}</LinkProvider>;
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```tsx
|
|
113
|
+
// app/layout.tsx
|
|
114
|
+
import '@troychaplin/parlour-ui/styles.css';
|
|
115
|
+
import { Providers } from './providers';
|
|
116
|
+
|
|
117
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
118
|
+
return (
|
|
119
|
+
<html lang="en">
|
|
120
|
+
<body>
|
|
121
|
+
<Providers>{children}</Providers>
|
|
122
|
+
</body>
|
|
123
|
+
</html>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
With the Pages Router, import the stylesheet and add `LinkProvider` in `pages/_app.tsx`.
|
|
129
|
+
|
|
130
|
+
### What the package ships
|
|
131
|
+
|
|
132
|
+
Every path below starts with `@troychaplin/parlour-ui`.
|
|
133
|
+
|
|
134
|
+
| Path | Contents |
|
|
135
|
+
| --------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
136
|
+
| _(package root)_ | Every React component, as ES modules and CommonJS, with TypeScript types |
|
|
137
|
+
| `/styles.css` | The full stylesheet: tokens, base styles, layout classes, every component, and the fonts |
|
|
138
|
+
| `/tokens.css` | The design tokens as `--parlour--*` custom properties |
|
|
139
|
+
| `/base-styles.css` | Element defaults for the body, headings, links and buttons |
|
|
140
|
+
| `/layout.css` | Layout classes that match WordPress's, such as `is-layout-constrained` |
|
|
141
|
+
| `/typography.css` | Spacing after headings |
|
|
142
|
+
| `/fonts.css` | `@font-face` rules for the bundled fonts |
|
|
143
|
+
| `/tokens` | The token names as a JavaScript object, `parlourTokens` |
|
|
144
|
+
| `/<Component>` | One component's JavaScript, such as `/Button` |
|
|
145
|
+
| `/<Component>.css` | One component's CSS, such as `/Button.css` |
|
|
146
|
+
| `/block-theme.css`, `/hybrid-theme.css` | Stylesheets for WordPress themes |
|
|
147
|
+
|
|
148
|
+
The WordPress theme files, `integrate.php` and `theme-parlour.json`, are in `dist/wordpress/`, and
|
|
149
|
+
the font files are in `dist/fonts/`. Copy those by path.
|
|
150
|
+
|
|
151
|
+
### WordPress themes
|
|
152
|
+
|
|
153
|
+
`dist/wordpress/` has what a theme needs:
|
|
154
|
+
|
|
155
|
+
- `theme-parlour.json` — the tokens as `theme.json` presets: the color palette and gradient, 16
|
|
156
|
+
fluid font sizes, the three font families with their font files, the spacing scale, shadows,
|
|
157
|
+
and the content and wide widths. It also sets default styles for text, headings, links, buttons
|
|
158
|
+
and captions.
|
|
159
|
+
- `integrate.php` — loads `theme-parlour.json` as WordPress's default `theme.json` layer, so your
|
|
160
|
+
theme's own `theme.json` only needs to hold overrides.
|
|
161
|
+
- `block-theme.css` — for block themes: the tokens, the `.sr-only` utility and heading spacing.
|
|
162
|
+
- `hybrid-theme.css` — for hybrid themes with PHP templates: adds Parlour's element defaults,
|
|
163
|
+
layout classes and global styles.
|
|
164
|
+
|
|
165
|
+
To set up a theme:
|
|
166
|
+
|
|
167
|
+
1. Copy `integrate.php`, `theme-parlour.json` and the stylesheet you need into one folder in your
|
|
168
|
+
theme, such as `assets/parlour/`. `integrate.php` looks for `theme-parlour.json` next to itself.
|
|
169
|
+
2. Copy `dist/fonts/` to `assets/fonts/` in your theme, the path `theme-parlour.json` gives for the
|
|
170
|
+
font files.
|
|
171
|
+
3. Load everything from `functions.php`:
|
|
172
|
+
|
|
173
|
+
```php
|
|
174
|
+
require_once get_theme_file_path( 'assets/parlour/integrate.php' );
|
|
175
|
+
|
|
176
|
+
add_action( 'wp_enqueue_scripts', function () {
|
|
177
|
+
wp_enqueue_style( 'parlour', get_theme_file_uri( 'assets/parlour/block-theme.css' ) );
|
|
178
|
+
} );
|
|
179
|
+
|
|
180
|
+
add_action( 'after_setup_theme', function () {
|
|
181
|
+
add_editor_style( 'assets/parlour/block-theme.css' );
|
|
182
|
+
} );
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
For a hybrid theme, use `hybrid-theme.css` in both places.
|
|
186
|
+
|
|
187
|
+
Parlour is built locked, so `integrate.php` also stops the theme from changing the layout widths
|
|
188
|
+
and breakpoints, and turns off custom colors, gradients and duotone in the Site Editor.
|
|
189
|
+
|
|
190
|
+
### WordPress blocks
|
|
191
|
+
|
|
192
|
+
Each component's CSS is also published on its own, so a block can bundle just the styles for the
|
|
193
|
+
markup it renders. Component CSS reads the `--parlour--*` custom properties, so the page needs the
|
|
194
|
+
tokens too: a theme set up as above already loads them, and otherwise the block should bundle
|
|
195
|
+
`tokens.css`.
|
|
196
|
+
|
|
197
|
+
With `@wordpress/scripts`, import them at the top of the block's `style.scss`, which loads in the
|
|
198
|
+
editor and on the front end:
|
|
199
|
+
|
|
200
|
+
```scss
|
|
201
|
+
// src/my-block/style.scss
|
|
202
|
+
@import '@troychaplin/parlour-ui/tokens.css';
|
|
203
|
+
@import '@troychaplin/parlour-ui/Button.css';
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Design tokens
|
|
207
|
+
|
|
208
|
+
Every CSS variable uses the `--parlour--` prefix (double dash).
|
|
209
|
+
|
|
210
|
+
| Category | What's in it |
|
|
211
|
+
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
212
|
+
| **Colors** | `accent-primary` and `accent-secondary`, an 11-step neutral ramp (`neutral-50` → `neutral-950`), semantic states (`info`, `success`, `warning`, `error`), and brand colors for seven social platforms |
|
|
213
|
+
| **Typography** | Three families (Inter Tight, Source Serif 4, JetBrains Mono), 16 fluid size steps, nine weights, three line heights |
|
|
214
|
+
| **Spacing** | A 12-step scale from `3-x-small` to `5-x-large`, fluid from `small` upward |
|
|
215
|
+
| **Effects** | Five shadow presets (natural, deep, sharp, outlined, crisp), five border radii, and a gradient |
|
|
216
|
+
| **Layout** | Content width (768px), wide width (1152px), small (600px), and full-bleed |
|
|
217
|
+
|
|
218
|
+
Browse them live in Storybook under **Stylebook**.
|
|
219
|
+
|
|
220
|
+
## Accessibility
|
|
221
|
+
|
|
222
|
+
Every Storybook story is tested against axe with `test: 'error'` — stories
|
|
223
|
+
that fail accessibility checks will not pass CI.
|
|
224
|
+
|
|
225
|
+
## Documentation
|
|
226
|
+
|
|
227
|
+
The [live Storybook](https://troychaplin.github.io/parlour-ui/) is the reference:
|
|
228
|
+
**Getting Started** covers installation and framework integration, **Stylebook** has live token
|
|
229
|
+
demos, and every component ships its own docs page with props, CSS classes, tokens, and
|
|
230
|
+
accessibility notes.
|
|
231
|
+
|
|
232
|
+
Contributor conventions — how to build a component's TSX, styles, stories and docs — are in
|
|
233
|
+
[`AGENTS.md`](AGENTS.md) and the [`build-component` skill](.claude/skills/build-component/SKILL.md).
|
|
234
|
+
|
|
235
|
+
## Developing Parlour
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# Requires Node 24+ (see .nvmrc)
|
|
239
|
+
nvm use
|
|
240
|
+
|
|
241
|
+
pnpm install
|
|
242
|
+
|
|
243
|
+
# First time only: download Playwright browser binaries (used by pnpm test:storybook)
|
|
244
|
+
pnpm exec playwright install chromium
|
|
245
|
+
|
|
246
|
+
pnpm run dev # Storybook at http://localhost:6006
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Scripts
|
|
250
|
+
|
|
251
|
+
| Command | Description |
|
|
252
|
+
| ---------------------------- | --------------------------------------------------------------------------------------------------- |
|
|
253
|
+
| `pnpm run dev` | Run `c2b generate` then start Storybook dev server |
|
|
254
|
+
| `pnpm run build` | Library build: ESM and CommonJS bundles, per-component files, types, tokens and the WordPress files |
|
|
255
|
+
| `pnpm run build-storybook` | Build static Storybook for deployment |
|
|
256
|
+
| `pnpm run c2b` | Regenerate tokens, base styles, and WP theme files |
|
|
257
|
+
| `pnpm run typecheck` | TypeScript type checking (no emit) |
|
|
258
|
+
| `pnpm run lint` | ESLint across `src/` |
|
|
259
|
+
| `pnpm run lint:fix` | ESLint with auto-fix |
|
|
260
|
+
| `pnpm run format` | Prettier write across `src/` (TS, TSX, SCSS) |
|
|
261
|
+
| `pnpm run format:check` | Prettier check across `src/` (no write) |
|
|
262
|
+
| `pnpm run test` | Vitest: unit tests plus every story with axe checks (requires Playwright) |
|
|
263
|
+
| `pnpm run test:watch` | Vitest in watch mode |
|
|
264
|
+
| `pnpm run test:storybook` | Every story with axe checks only (requires Playwright) |
|
|
265
|
+
| `pnpm run test:coverage` | Vitest with coverage report |
|
|
266
|
+
| `pnpm run size` | Check the JS bundle and stylesheet against their size budgets |
|
|
267
|
+
| `pnpm run release <version>` | Changelog, version bump, commit and tag on main. Push the tag to publish to npm |
|
|
268
|
+
|
|
269
|
+
### Formatting & code style
|
|
270
|
+
|
|
271
|
+
Formatting is enforced automatically so contributors don't create diffs based on
|
|
272
|
+
personal editor preferences:
|
|
273
|
+
|
|
274
|
+
- **EditorConfig** (`.editorconfig`) sets base whitespace rules (4-space indent, LF
|
|
275
|
+
line endings, trimmed trailing whitespace) recognized by most editors.
|
|
276
|
+
- **Prettier** (`.prettierrc`) formats TS/TSX/SCSS in `src/`, and JSON, Markdown and MDX
|
|
277
|
+
files when they're committed. `.prettierignore` excludes build output and generated files
|
|
278
|
+
(`dist/`, `storybook-static/`, `src/styles/c2b/`, etc.).
|
|
279
|
+
- **ESLint** (`eslint.config.mjs`) lints `src/` for code quality (React, hooks,
|
|
280
|
+
jsx-a11y, Storybook rules), with `eslint-config-prettier` disabling any
|
|
281
|
+
formatting rules that could conflict with Prettier.
|
|
282
|
+
- **VSCode workspace settings** (`.vscode/settings.json`, committed to the repo)
|
|
283
|
+
set Prettier as the default formatter with format-on-save and ESLint
|
|
284
|
+
auto-fix-on-save enabled. `.vscode/extensions.json` recommends the Prettier,
|
|
285
|
+
ESLint, and EditorConfig extensions so VSCode prompts new contributors to
|
|
286
|
+
install them.
|
|
287
|
+
- **`.gitattributes`** normalizes line endings to LF across operating systems.
|
|
288
|
+
- **Husky + lint-staged**: on every commit, `.husky/pre-commit` runs
|
|
289
|
+
`lint-staged` first, which formats and auto-fixes only the files staged in
|
|
290
|
+
that commit (Prettier for TS/TSX/SCSS/JSON/MD/MDX, ESLint `--fix` for TS/TSX).
|
|
291
|
+
It then runs the full `pnpm lint` and `pnpm typecheck` as a final check
|
|
292
|
+
across the whole project. `.husky/pre-push` runs `pnpm test:storybook`.
|
|
293
|
+
|
|
294
|
+
Run `pnpm format` to format everything in `src/`, or `pnpm format:check` to verify formatting
|
|
295
|
+
without writing changes.
|
|
296
|
+
|
|
297
|
+
### Project structure
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
c2b.config.json # Design token definitions (source of truth)
|
|
301
|
+
src/
|
|
302
|
+
index.ts # Package entry — component exports + global stylesheet
|
|
303
|
+
components/ # React components (co-located SCSS, stories, docs, types)
|
|
304
|
+
tokens/ # Runtime token export (parlourTokens)
|
|
305
|
+
docs/ # Storybook documentation pages
|
|
306
|
+
getting-started/ # Install and framework integration guides
|
|
307
|
+
stylebook/ # Live token demos (colors, typography, spacing, effects)
|
|
308
|
+
styles/
|
|
309
|
+
main.scss # Consumer-facing stylesheet entry
|
|
310
|
+
base/ # Hand-authored globals (focus, selection, utilities)
|
|
311
|
+
c2b/ # Generated by c2b — never edit by hand
|
|
312
|
+
parlour-tokens.css # CSS custom properties
|
|
313
|
+
parlour-base-styles.css # Element defaults (body, h1–h6, links, buttons)
|
|
314
|
+
parlour-layout.css # Layout and flow-spacing utilities
|
|
315
|
+
parlour-typography.css # Heading flow spacing
|
|
316
|
+
_parlour-variables.scss # SCSS variables + breakpoint mixins
|
|
317
|
+
wordpress/ # Block-theme and hybrid-theme SCSS entry points
|
|
318
|
+
dist/
|
|
319
|
+
wordpress/ # integrate.php, theme-parlour.json, block- and hybrid-theme CSS
|
|
320
|
+
fonts/ # Font files used by styles.css and theme-parlour.json
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Links
|
|
324
|
+
|
|
325
|
+
- [Storybook](https://troychaplin.github.io/parlour-ui/)
|
|
326
|
+
- [npm](https://www.npmjs.com/package/@troychaplin/parlour-ui)
|
|
327
|
+
- [Source](https://github.com/troychaplin/parlour-ui)
|
|
328
|
+
- [Changelog](CHANGELOG.mdx)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./shared-B07rlYN8.cjs");let n=require("react");n=e.t(n,1);let r=require("react/jsx-runtime");var i=(0,n.createContext)(e=>(0,r.jsx)(`a`,{...e})),a=()=>(0,n.useContext)(i),o=({text:e=`Button`,color:t=`medium`,rounded:n=`sm`,type:i=`button`,isSmall:o=!1,isFull:s=!1,isOutline:c=!1,disabled:l=!1,className:u,...d})=>{let f=a(),p=[`parlour-button`,l?`parlour-button--disabled`:`parlour-button--${t}`,n&&`parlour-button--radius-${n}`,c&&!l&&`parlour-button--outline`,o&&`parlour-button--small`,s&&`parlour-button--full`,u].filter(Boolean).join(` `);return d.href===void 0?(0,r.jsx)(`button`,{type:i,className:p,disabled:l,...d,children:e}):(0,r.jsx)(f,{className:p,...d,children:e})},s=({component:e,children:t})=>(0,r.jsx)(i.Provider,{value:e,children:t}),c=[{href:`/about`,label:`About`},{href:`/blog`,label:`Blog`},{href:`/resume`,label:`Resume`}],l=(e,t)=>{let n=t?e.indexOf(t):-1;return!t||n===-1?[e]:[e.slice(0,n),t,e.slice(n+t.length)]},u=({className:e=``,children:n,siteTitle:i=`Parlour`,siteTitleAccent:s})=>{let u=[`parlour-site-header`,e].filter(Boolean).join(` `),d=a(),[f,p,m]=l(i,s);return(0,r.jsx)(`header`,{className:u,children:(0,r.jsxs)(t.f,{gap:`normal`,maxWidth:`alignwide`,justify:`space-between`,align:`center`,children:[(0,r.jsx)(`div`,{className:`parlour-site-header__branding`,children:(0,r.jsx)(`p`,{children:(0,r.jsxs)(d,{href:`/`,rel:`home`,children:[f,p&&(0,r.jsx)(`span`,{className:`parlour-site-header__title-accent`,children:p}),m]})})}),(0,r.jsx)(`nav`,{className:`parlour-site-header__nav`,"aria-label":`Primary`,children:(0,r.jsx)(`ul`,{children:c.map(({href:e,label:t})=>(0,r.jsx)(`li`,{children:(0,r.jsx)(d,{href:e,children:t})},e))})}),(0,r.jsx)(`div`,{children:(0,r.jsx)(t.d,{children:(0,r.jsx)(o,{text:`Hire Me`,isSmall:!0,isOutline:!0})})}),n]})})};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { d as e, f as t } from "./shared-DZTw1JIu.mjs";
|
|
3
|
+
import { createContext as n, useContext as r } from "react";
|
|
4
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
var o = n((e) => /* @__PURE__ */ i("a", { ...e })), s = () => r(o), c = ({ text: e = "Button", color: t = "medium", rounded: n = "sm", type: r = "button", isSmall: a = !1, isFull: o = !1, isOutline: c = !1, disabled: l = !1, className: u, ...d }) => {
|
|
6
|
+
let f = s(), p = [
|
|
7
|
+
"parlour-button",
|
|
8
|
+
l ? "parlour-button--disabled" : `parlour-button--${t}`,
|
|
9
|
+
n && `parlour-button--radius-${n}`,
|
|
10
|
+
c && !l && "parlour-button--outline",
|
|
11
|
+
a && "parlour-button--small",
|
|
12
|
+
o && "parlour-button--full",
|
|
13
|
+
u
|
|
14
|
+
].filter(Boolean).join(" ");
|
|
15
|
+
return d.href === void 0 ? /* @__PURE__ */ i("button", {
|
|
16
|
+
type: r,
|
|
17
|
+
className: p,
|
|
18
|
+
disabled: l,
|
|
19
|
+
...d,
|
|
20
|
+
children: e
|
|
21
|
+
}) : /* @__PURE__ */ i(f, {
|
|
22
|
+
className: p,
|
|
23
|
+
...d,
|
|
24
|
+
children: e
|
|
25
|
+
});
|
|
26
|
+
}, l = ({ component: e, children: t }) => /* @__PURE__ */ i(o.Provider, {
|
|
27
|
+
value: e,
|
|
28
|
+
children: t
|
|
29
|
+
}), u = [
|
|
30
|
+
{
|
|
31
|
+
href: "/about",
|
|
32
|
+
label: "About"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
href: "/blog",
|
|
36
|
+
label: "Blog"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
href: "/resume",
|
|
40
|
+
label: "Resume"
|
|
41
|
+
}
|
|
42
|
+
], d = (e, t) => {
|
|
43
|
+
let n = t ? e.indexOf(t) : -1;
|
|
44
|
+
return !t || n === -1 ? [e] : [
|
|
45
|
+
e.slice(0, n),
|
|
46
|
+
t,
|
|
47
|
+
e.slice(n + t.length)
|
|
48
|
+
];
|
|
49
|
+
}, f = ({ className: n = "", children: r, siteTitle: o = "Parlour", siteTitleAccent: l }) => {
|
|
50
|
+
let f = ["parlour-site-header", n].filter(Boolean).join(" "), p = s(), [m, h, g] = d(o, l);
|
|
51
|
+
return /* @__PURE__ */ i("header", {
|
|
52
|
+
className: f,
|
|
53
|
+
children: /* @__PURE__ */ a(t, {
|
|
54
|
+
gap: "normal",
|
|
55
|
+
maxWidth: "alignwide",
|
|
56
|
+
justify: "space-between",
|
|
57
|
+
align: "center",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ i("div", {
|
|
60
|
+
className: "parlour-site-header__branding",
|
|
61
|
+
children: /* @__PURE__ */ i("p", { children: /* @__PURE__ */ a(p, {
|
|
62
|
+
href: "/",
|
|
63
|
+
rel: "home",
|
|
64
|
+
children: [
|
|
65
|
+
m,
|
|
66
|
+
h && /* @__PURE__ */ i("span", {
|
|
67
|
+
className: "parlour-site-header__title-accent",
|
|
68
|
+
children: h
|
|
69
|
+
}),
|
|
70
|
+
g
|
|
71
|
+
]
|
|
72
|
+
}) })
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ i("nav", {
|
|
75
|
+
className: "parlour-site-header__nav",
|
|
76
|
+
"aria-label": "Primary",
|
|
77
|
+
children: /* @__PURE__ */ i("ul", { children: u.map(({ href: e, label: t }) => /* @__PURE__ */ i("li", { children: /* @__PURE__ */ i(p, {
|
|
78
|
+
href: e,
|
|
79
|
+
children: t
|
|
80
|
+
}) }, e)) })
|
|
81
|
+
}),
|
|
82
|
+
/* @__PURE__ */ i("div", { children: /* @__PURE__ */ i(e, { children: /* @__PURE__ */ i(c, {
|
|
83
|
+
text: "Hire Me",
|
|
84
|
+
isSmall: !0,
|
|
85
|
+
isOutline: !0
|
|
86
|
+
}) }) }),
|
|
87
|
+
r
|
|
88
|
+
]
|
|
89
|
+
})
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
//#endregion
|
|
93
|
+
export { l as n, c as r, f as t };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return s}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./rolldown-runtime-BocRIvOZ.cjs");let t=require("react");t=e.t(t,1);let n=require("react/jsx-runtime");var r=({children:e,content:t})=>t?(0,n.jsx)(`article`,{dangerouslySetInnerHTML:{__html:t}}):(0,n.jsx)(`article`,{children:e}),i=({children:e,isSticky:t,topSpace:r=0,className:i,...a})=>{let o=[`relative`,`parlour-aside`,`parlour-prose`,i].filter(Boolean).join(` `);return(0,n.jsx)(`aside`,{className:o,...a,children:t?(0,n.jsx)(`div`,{className:`sticky`,style:{top:`${r}px`},children:e}):e})},a=({children:e,className:t})=>(0,n.jsx)(`body`,{className:t||``,children:e}),o=({children:e,hasPadding:t=!0,className:r,...i})=>{let a=[`parlour-main`,t&&`parlour-main--padding`,r].filter(Boolean).join(` `);return(0,n.jsx)(`main`,{className:a,...i,children:(0,n.jsx)(`div`,{className:`alignfull has-global-padding is-layout-constrained entry-content`,children:e})})},s={color:{black:`black`,white:`white`,"accent-primary":`accent-primary`,"accent-secondary":`accent-secondary`,"neutral-50":`neutral-50`,"neutral-100":`neutral-100`,"neutral-200":`neutral-200`,"neutral-300":`neutral-300`,"neutral-400":`neutral-400`,"neutral-500":`neutral-500`,"neutral-600":`neutral-600`,"neutral-700":`neutral-700`,"neutral-800":`neutral-800`,"neutral-900":`neutral-900`,"neutral-950":`neutral-950`,info:`info`,success:`success`,warning:`warning`,error:`error`,linkedin:`linkedin`,facebook:`facebook`,bluesky:`bluesky`,twitter:`twitter`,instagram:`instagram`,youtube:`youtube`,tiktok:`tiktok`},gradient:{"white-to-neutral-50":`white-to-neutral-50`},spacing:{"3-x-small":`3-x-small`,"2-x-small":`2-x-small`,"x-small":`x-small`,small:`small`,normal:`normal`,medium:`medium`,large:`large`,"x-large":`x-large`,"2-x-large":`2-x-large`,"3-x-large":`3-x-large`,"4-x-large":`4-x-large`,"5-x-large":`5-x-large`},fontFamily:{"inter-tight":`inter-tight`,"source-serif-4":`source-serif-4`,"jetbrains-mono":`jetbrains-mono`},fontSize:{"2-x-small":`2-x-small`,"x-small":`x-small`,small:`small`,medium:`medium`,large:`large`,"x-large":`x-large`,"2-x-large":`2-x-large`,"3-x-large":`3-x-large`,"4-x-large":`4-x-large`,"5-x-large":`5-x-large`,hero:`hero`,"heading-small":`heading-small`,"heading-medium":`heading-medium`,"heading-large":`heading-large`,"heading-x-large":`heading-x-large`,"heading-primary":`heading-primary`},shadow:{natural:`natural`,deep:`deep`,sharp:`sharp`,outlined:`outlined`,crisp:`crisp`},fontWeight:{thin:`thin`,"extra-light":`extra-light`,light:`light`,normal:`normal`,medium:`medium`,semibold:`semibold`,bold:`bold`,"extra-bold":`extra-bold`,black:`black`},lineHeight:{tight:`tight`,normal:`normal`,loose:`loose`},radius:{sm:`sm`,md:`md`,lg:`lg`,xl:`xl`,full:`full`},transition:{fast:`fast`,base:`base`},z:{100:`100`,200:`200`,500:`500`},layout:{"content-size":`content-size`,"wide-size":`wide-size`,"small-size":`small-size`,"full-size":`full-size`},viewport:{mobile:`mobile`,tablet:`tablet`}},c={alignsmall:`alignsmall`,aligncontent:`aligncontent`,alignwide:`alignwide`,alignfull:`alignfull`},l={1:`one`,2:`two`,3:`three`,4:`four`,"1/3":`one-third`,"2/3":`two-thirds`};({...s.color});var u={none:`none`,...s.spacing},d={none:`none`,...s.radius},f={start:`start`,center:`center`,end:`end`,"space-between":`space-between`},p={start:`start`,center:`center`,end:`end`,stretch:`stretch`},m={light:`light`,medium:`medium`,dark:`dark`,white:`white`},h=({children:e,as:t=`div`,direction:r=`row`,wrap:i=`wrap`,justify:a,align:o,gap:s,padding:l,margin:d,maxWidth:m,className:h,...g})=>{let _=t,v=[`parlour-layout parlour-flex-group`,`parlour-flex-group--${r}`,`parlour-flex-group--${i}`,m&&c[m],a&&`parlour-flex-group--justify-${f[a]}`,o&&`parlour-flex-group--align-${p[o]}`,s&&`parlour-flex-group--gap-${u[s]}`,l&&`parlour-flex-group--padding-${u[l]}`,d&&`parlour-flex-group--margin-${u[d]}`,h].filter(Boolean).join(` `);return(0,n.jsx)(_,{className:v,...g,children:e})},g=({children:e,align:t=`start`})=>(0,n.jsx)(`div`,{className:`parlour-buttongroup parlour-buttongroup--justify-${t}`,children:e}),_=864e5,v=e=>(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())-Date.UTC(e.getFullYear(),0,0))/_,y=e=>[e.getFullYear(),e.getMonth()+1,e.getDate()].map(e=>String(e).padStart(2,`0`)).join(`-`),b=({className:e=``,children:t,date:r=new Date})=>{let i=[`parlour-infobar`,e].filter(Boolean).join(` `),a=r.toLocaleDateString(`en-US`,{month:`long`,day:`numeric`,year:`numeric`});return(0,n.jsx)(`div`,{className:i,children:(0,n.jsxs)(h,{gap:`normal`,maxWidth:`alignwide`,justify:`space-between`,align:`center`,children:[(0,n.jsx)(`p`,{children:`Building since 2005`}),(0,n.jsxs)(`p`,{children:[`Day `,v(r),` `,(0,n.jsx)(`span`,{"aria-hidden":`true`,children:`•`}),` `,(0,n.jsx)(`time`,{dateTime:y(r),children:a})]}),t]})})},x=({children:e,isFirst:t=!1})=>(0,n.jsx)(`div`,{className:`parlour-column__content ${t?`is-first`:``}`,children:e});x.displayName=`Column.Content`;var S=({children:e,cols:t=`2`,maxWidth:r=`aligncontent`})=>{let i=[`parlour-layout parlour-column parlour-column--${l[t]}`,r].filter(Boolean).join(` `);return(0,n.jsx)(`div`,{className:i,children:e})},C=Object.assign(S,{Content:x});S.displayName=`Column`;var w=({children:e,as:t=`div`,columns:r=3,gap:i=`medium`,rowGap:a,align:o,maxWidth:s,className:l,...d})=>{let f=t,m=[`parlour-layout parlour-grid-group`,`parlour-grid-group--columns-${r}`,`parlour-grid-group--gap-${u[i]}`,a&&`parlour-grid-group--row-gap-${u[a]}`,o&&`parlour-grid-group--align-${p[o]}`,s&&c[s],l].filter(Boolean).join(` `);return(0,n.jsx)(f,{className:m,role:t===`ul`||t===`ol`?`list`:void 0,...d,children:e})},T=({children:e,as:t=`div`,maxWidth:r=`aligncontent`,contentWidth:i=`aligncontent`,color:a,className:o,borderRadius:s=`md`,...c})=>{let l=t,u=[`parlour-layout parlour-container`,`is-layout-constrained`,r,a&&`parlour-container--no-gap parlour-container--${a}`,s&&`parlour-container--radius-${s}`,o].filter(Boolean).join(` `),d=[`has-global-padding`,i,a&&`has-root-padding`].filter(Boolean).join(` `);return(0,n.jsx)(l,{className:u,...c,children:(0,n.jsx)(`div`,{className:d,children:e})})},E=({children:e,as:t=`div`,backgroundColor:r=`light`,border:i=!0,borderColor:a=`light`,borderRadius:o=`none`,padding:s=`large`,className:c,...l})=>{let f=t,p=[`parlour-card`,`parlour-card--bg-${m[r]}`,i&&`parlour-card--border`,i&&`parlour-card--border-${m[a]}`,`parlour-card--radius-${d[o]}`,`parlour-card--padding-${u[s]}`,c].filter(Boolean).join(` `);return(0,n.jsx)(f,{className:p,...l,children:e})},D=({code:e,color:t,className:r,hasBorder:i,borderRadius:a,...o})=>{let s=[`parlour-code-block`,t&&`parlour-code-block--${m[t]}`,i&&`parlour-code-block--has-border`,a&&`parlour-code-block--radius-${d[a]}`,r].filter(Boolean).join(` `);return(0,n.jsx)(`pre`,{className:s,tabIndex:0,...o,children:(0,n.jsx)(`code`,{children:e})})},O=({children:e,caption:t,size:r=`full`,align:i=`none`})=>{let a=i===`left`?`alignleft`:i===`right`?`alignright`:``,o=[`parlour-figure`,`parlour-figure--${r}`,i===`none`?``:`parlour-figure--${i}`,a].filter(Boolean).join(` `);return(0,n.jsx)(`figure`,{className:o,children:(0,n.jsxs)(`div`,{className:`parlour-figure__inner`,children:[e,t&&(0,n.jsx)(`figcaption`,{className:`parlour-figure__caption`,children:t})]})})},k=({className:e=``,children:t})=>{let r=[`parlour-hero`,e].filter(Boolean).join(` `);return(0,n.jsx)(T,{as:`section`,className:r,maxWidth:`alignfull`,contentWidth:`alignwide`,children:(0,n.jsx)(h,{gap:`normal`,maxWidth:`alignwide`,justify:`space-between`,align:`center`,children:t})})},A=({className:e,prefix:t,title:r,titleAccent:i,level:a=1,children:o,...s})=>{let c=[`parlour-hero-header`,e].filter(Boolean).join(` `),l=`h${a}`;return(0,n.jsxs)(`header`,{className:c,...s,children:[t&&(0,n.jsx)(`p`,{className:`parlour-hero-header__prefix`,children:t}),r&&(0,n.jsxs)(l,{className:`parlour-hero-header__title`,children:[r,` `,i&&(0,n.jsx)(`span`,{className:`parlour-hero-header__title-accent`,children:i})]}),o]})},j=({className:e,prefix:t,title:r,level:i=2,...a})=>{let o=[`parlour-section-header`,e].filter(Boolean).join(` `),s=`h${i}`;return(0,n.jsxs)(`header`,{className:o,...a,children:[t&&(0,n.jsx)(`p`,{className:`parlour-section-header__prefix`,children:t}),r&&(0,n.jsx)(s,{className:`parlour-section-header__title`,children:r})]})};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return b}});
|