@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.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/_shared/client-CLAcY4nN.cjs +1 -0
  4. package/dist/_shared/client-CsCPbj42.mjs +93 -0
  5. package/dist/_shared/rolldown-runtime-BocRIvOZ.cjs +1 -0
  6. package/dist/_shared/shared-B07rlYN8.cjs +1 -0
  7. package/dist/_shared/shared-DZTw1JIu.mjs +400 -0
  8. package/dist/components/Article/Article.d.ts +7 -0
  9. package/dist/components/Article/Article.d.ts.map +1 -0
  10. package/dist/components/Article/index.cjs +1 -0
  11. package/dist/components/Article/index.d.ts +9 -0
  12. package/dist/components/Article/index.d.ts.map +1 -0
  13. package/dist/components/Article/index.mjs +6 -0
  14. package/dist/components/Aside/Aside.d.ts +9 -0
  15. package/dist/components/Aside/Aside.d.ts.map +1 -0
  16. package/dist/components/Aside/index.cjs +1 -0
  17. package/dist/components/Aside/index.d.ts +12 -0
  18. package/dist/components/Aside/index.d.ts.map +1 -0
  19. package/dist/components/Aside/index.mjs +22 -0
  20. package/dist/components/Aside/styles.css +3 -0
  21. package/dist/components/Aside/styles.scss +3 -0
  22. package/dist/components/Body/Body.d.ts +7 -0
  23. package/dist/components/Body/Body.d.ts.map +1 -0
  24. package/dist/components/Body/index.cjs +1 -0
  25. package/dist/components/Body/index.d.ts +9 -0
  26. package/dist/components/Body/index.d.ts.map +1 -0
  27. package/dist/components/Body/index.mjs +9 -0
  28. package/dist/components/Button/Button.d.ts +24 -0
  29. package/dist/components/Button/Button.d.ts.map +1 -0
  30. package/dist/components/Button/index.cjs +1 -0
  31. package/dist/components/Button/index.d.ts +35 -0
  32. package/dist/components/Button/index.d.ts.map +1 -0
  33. package/dist/components/Button/index.mjs +2 -0
  34. package/dist/components/Button/styles.css +120 -0
  35. package/dist/components/Button/styles.scss +120 -0
  36. package/dist/components/ButtonGroup/ButtonGroup.d.ts +10 -0
  37. package/dist/components/ButtonGroup/ButtonGroup.d.ts.map +1 -0
  38. package/dist/components/ButtonGroup/index.cjs +1 -0
  39. package/dist/components/ButtonGroup/index.d.ts +17 -0
  40. package/dist/components/ButtonGroup/index.d.ts.map +1 -0
  41. package/dist/components/ButtonGroup/index.mjs +2 -0
  42. package/dist/components/ButtonGroup/styles.css +22 -0
  43. package/dist/components/ButtonGroup/styles.scss +22 -0
  44. package/dist/components/Card/Card.d.ts +16 -0
  45. package/dist/components/Card/Card.d.ts.map +1 -0
  46. package/dist/components/Card/index.cjs +1 -0
  47. package/dist/components/Card/index.d.ts +48 -0
  48. package/dist/components/Card/index.d.ts.map +1 -0
  49. package/dist/components/Card/index.mjs +21 -0
  50. package/dist/components/Card/styles.css +133 -0
  51. package/dist/components/Card/styles.scss +133 -0
  52. package/dist/components/CodeBlock/CodeBlock.d.ts +12 -0
  53. package/dist/components/CodeBlock/CodeBlock.d.ts.map +1 -0
  54. package/dist/components/CodeBlock/index.cjs +1 -0
  55. package/dist/components/CodeBlock/index.d.ts +29 -0
  56. package/dist/components/CodeBlock/index.d.ts.map +1 -0
  57. package/dist/components/CodeBlock/index.mjs +20 -0
  58. package/dist/components/CodeBlock/styles.css +53 -0
  59. package/dist/components/CodeBlock/styles.scss +53 -0
  60. package/dist/components/Column/Column.d.ts +23 -0
  61. package/dist/components/Column/Column.d.ts.map +1 -0
  62. package/dist/components/Column/ColumnContent.d.ts +10 -0
  63. package/dist/components/Column/ColumnContent.d.ts.map +1 -0
  64. package/dist/components/Column/index.cjs +1 -0
  65. package/dist/components/Column/index.d.ts +33 -0
  66. package/dist/components/Column/index.d.ts.map +1 -0
  67. package/dist/components/Column/index.mjs +21 -0
  68. package/dist/components/Column/styles.css +74 -0
  69. package/dist/components/Column/styles.scss +74 -0
  70. package/dist/components/Container/Container.d.ts +16 -0
  71. package/dist/components/Container/Container.d.ts.map +1 -0
  72. package/dist/components/Container/index.cjs +1 -0
  73. package/dist/components/Container/index.d.ts +51 -0
  74. package/dist/components/Container/index.d.ts.map +1 -0
  75. package/dist/components/Container/index.mjs +2 -0
  76. package/dist/components/Container/styles.css +126 -0
  77. package/dist/components/Container/styles.scss +126 -0
  78. package/dist/components/Figure/Figure.d.ts +12 -0
  79. package/dist/components/Figure/Figure.d.ts.map +1 -0
  80. package/dist/components/Figure/index.cjs +1 -0
  81. package/dist/components/Figure/index.d.ts +14 -0
  82. package/dist/components/Figure/index.d.ts.map +1 -0
  83. package/dist/components/Figure/index.mjs +23 -0
  84. package/dist/components/Figure/styles.css +78 -0
  85. package/dist/components/Figure/styles.scss +78 -0
  86. package/dist/components/FlexGroup/FlexGroup.d.ts +21 -0
  87. package/dist/components/FlexGroup/FlexGroup.d.ts.map +1 -0
  88. package/dist/components/FlexGroup/index.cjs +1 -0
  89. package/dist/components/FlexGroup/index.d.ts +69 -0
  90. package/dist/components/FlexGroup/index.d.ts.map +1 -0
  91. package/dist/components/FlexGroup/index.mjs +2 -0
  92. package/dist/components/FlexGroup/styles.css +197 -0
  93. package/dist/components/FlexGroup/styles.scss +197 -0
  94. package/dist/components/GridGroup/GridGroup.d.ts +16 -0
  95. package/dist/components/GridGroup/GridGroup.d.ts.map +1 -0
  96. package/dist/components/GridGroup/index.cjs +1 -0
  97. package/dist/components/GridGroup/index.d.ts +46 -0
  98. package/dist/components/GridGroup/index.d.ts.map +1 -0
  99. package/dist/components/GridGroup/index.mjs +22 -0
  100. package/dist/components/GridGroup/styles.css +144 -0
  101. package/dist/components/GridGroup/styles.scss +144 -0
  102. package/dist/components/Hero/Hero.d.ts +7 -0
  103. package/dist/components/Hero/Hero.d.ts.map +1 -0
  104. package/dist/components/Hero/index.cjs +1 -0
  105. package/dist/components/Hero/index.d.ts +9 -0
  106. package/dist/components/Hero/index.d.ts.map +1 -0
  107. package/dist/components/Hero/index.mjs +23 -0
  108. package/dist/components/Hero/styles.css +27 -0
  109. package/dist/components/Hero/styles.scss +27 -0
  110. package/dist/components/HeroHeader/HeroHeader.d.ts +11 -0
  111. package/dist/components/HeroHeader/HeroHeader.d.ts.map +1 -0
  112. package/dist/components/HeroHeader/index.cjs +1 -0
  113. package/dist/components/HeroHeader/index.d.ts +14 -0
  114. package/dist/components/HeroHeader/index.d.ts.map +1 -0
  115. package/dist/components/HeroHeader/index.mjs +30 -0
  116. package/dist/components/HeroHeader/styles.css +39 -0
  117. package/dist/components/HeroHeader/styles.scss +39 -0
  118. package/dist/components/InfoBar/InfoBar.d.ts +8 -0
  119. package/dist/components/InfoBar/InfoBar.d.ts.map +1 -0
  120. package/dist/components/InfoBar/index.cjs +1 -0
  121. package/dist/components/InfoBar/index.d.ts +10 -0
  122. package/dist/components/InfoBar/index.d.ts.map +1 -0
  123. package/dist/components/InfoBar/index.mjs +44 -0
  124. package/dist/components/InfoBar/styles.css +11 -0
  125. package/dist/components/InfoBar/styles.scss +11 -0
  126. package/dist/components/LinkProvider/LinkContext.d.ts +4 -0
  127. package/dist/components/LinkProvider/LinkContext.d.ts.map +1 -0
  128. package/dist/components/LinkProvider/index.cjs +1 -0
  129. package/dist/components/LinkProvider/index.d.ts +16 -0
  130. package/dist/components/LinkProvider/index.d.ts.map +1 -0
  131. package/dist/components/LinkProvider/index.mjs +11 -0
  132. package/dist/components/LinkProvider/useLinkContext.d.ts +2 -0
  133. package/dist/components/LinkProvider/useLinkContext.d.ts.map +1 -0
  134. package/dist/components/Main/Main.d.ts +8 -0
  135. package/dist/components/Main/Main.d.ts.map +1 -0
  136. package/dist/components/Main/index.cjs +1 -0
  137. package/dist/components/Main/index.d.ts +10 -0
  138. package/dist/components/Main/index.d.ts.map +1 -0
  139. package/dist/components/Main/index.mjs +20 -0
  140. package/dist/components/Main/styles.css +19 -0
  141. package/dist/components/Main/styles.scss +19 -0
  142. package/dist/components/SectionHeader/SectionHeader.d.ts +9 -0
  143. package/dist/components/SectionHeader/SectionHeader.d.ts.map +1 -0
  144. package/dist/components/SectionHeader/index.cjs +1 -0
  145. package/dist/components/SectionHeader/index.d.ts +12 -0
  146. package/dist/components/SectionHeader/index.d.ts.map +1 -0
  147. package/dist/components/SectionHeader/index.mjs +19 -0
  148. package/dist/components/SectionHeader/styles.css +29 -0
  149. package/dist/components/SectionHeader/styles.scss +29 -0
  150. package/dist/components/SiteHeader/SiteHeader.d.ts +9 -0
  151. package/dist/components/SiteHeader/SiteHeader.d.ts.map +1 -0
  152. package/dist/components/SiteHeader/index.cjs +1 -0
  153. package/dist/components/SiteHeader/index.d.ts +11 -0
  154. package/dist/components/SiteHeader/index.d.ts.map +1 -0
  155. package/dist/components/SiteHeader/index.mjs +73 -0
  156. package/dist/components/SiteHeader/styles.css +47 -0
  157. package/dist/components/SiteHeader/styles.scss +47 -0
  158. package/dist/components/_shared/Button-CAFrgdq8.mjs +28 -0
  159. package/dist/components/_shared/Button-CQIUEu-m.cjs +1 -0
  160. package/dist/components/_shared/ButtonGroup-B0V_8y-2.mjs +9 -0
  161. package/dist/components/_shared/ButtonGroup-ChqwMTps.cjs +1 -0
  162. package/dist/components/_shared/Container-Bl4f1ZwJ.cjs +1 -0
  163. package/dist/components/_shared/Container-OGjfScEb.mjs +26 -0
  164. package/dist/components/_shared/FlexGroup-CgPbyEha.cjs +1 -0
  165. package/dist/components/_shared/FlexGroup-CnOrx2MF.mjs +24 -0
  166. package/dist/components/_shared/parlour-tokens-BT0frVnY.cjs +1 -0
  167. package/dist/components/_shared/parlour-tokens-CHt4gBUd.mjs +245 -0
  168. package/dist/components/_shared/propClasses-CLbmpfVJ.cjs +1 -0
  169. package/dist/components/_shared/propClasses-R9s_eOfA.mjs +40 -0
  170. package/dist/components/_shared/rolldown-runtime-BocRIvOZ.cjs +1 -0
  171. package/dist/components/_shared/useLinkContext-CJko6HGf.mjs +6 -0
  172. package/dist/components/_shared/useLinkContext-DwwV1iqK.cjs +1 -0
  173. package/dist/components/tokens/index.cjs +1 -0
  174. package/dist/components/tokens/index.d.ts +5 -0
  175. package/dist/components/tokens/index.d.ts.map +1 -0
  176. package/dist/components/tokens/index.mjs +2 -0
  177. package/dist/data/ArticleData.d.ts +2 -0
  178. package/dist/data/ArticleData.d.ts.map +1 -0
  179. package/dist/data/CodeData.d.ts +3 -0
  180. package/dist/data/CodeData.d.ts.map +1 -0
  181. package/dist/data/ImageData.d.ts +5 -0
  182. package/dist/data/ImageData.d.ts.map +1 -0
  183. package/dist/data/NewsData.d.ts +11 -0
  184. package/dist/data/NewsData.d.ts.map +1 -0
  185. package/dist/data/SampleContent.d.ts +9 -0
  186. package/dist/data/SampleContent.d.ts.map +1 -0
  187. package/dist/data-images/attend-1-thumb.jpg +0 -0
  188. package/dist/data-images/attend-2-thumb.jpg +0 -0
  189. package/dist/data-images/attend-3-thumb.jpg +0 -0
  190. package/dist/data-images/attend-4-thumb.jpg +0 -0
  191. package/dist/data-images/event-1-thumb.jpg +0 -0
  192. package/dist/data-images/event-2-thumb.jpg +0 -0
  193. package/dist/data-images/event-3-thumb.jpg +0 -0
  194. package/dist/data-images/event-4-thumb.jpg +0 -0
  195. package/dist/data-images/story-1-thumb.jpg +0 -0
  196. package/dist/data-images/story-2-thumb.jpg +0 -0
  197. package/dist/data-images/story-3-thumb.jpg +0 -0
  198. package/dist/data-images/story-4-thumb.jpg +0 -0
  199. package/dist/docs/stylebook/components/BorderRadiusSamples.d.ts +7 -0
  200. package/dist/docs/stylebook/components/BorderRadiusSamples.d.ts.map +1 -0
  201. package/dist/docs/stylebook/components/ColorSwatches.d.ts +9 -0
  202. package/dist/docs/stylebook/components/ColorSwatches.d.ts.map +1 -0
  203. package/dist/docs/stylebook/components/ShadowSamples.d.ts +7 -0
  204. package/dist/docs/stylebook/components/ShadowSamples.d.ts.map +1 -0
  205. package/dist/docs/stylebook/components/SpacingScale.d.ts +8 -0
  206. package/dist/docs/stylebook/components/SpacingScale.d.ts.map +1 -0
  207. package/dist/docs/stylebook/components/TypographyScale.d.ts +23 -0
  208. package/dist/docs/stylebook/components/TypographyScale.d.ts.map +1 -0
  209. package/dist/fonts/inter-tight/inter-tight-variable-italic.woff2 +0 -0
  210. package/dist/fonts/inter-tight/inter-tight-variable-normal.woff2 +0 -0
  211. package/dist/fonts/jetbrains-mono/jetbrains-mono-variable-italic.woff2 +0 -0
  212. package/dist/fonts/jetbrains-mono/jetbrains-mono-variable-normal.woff2 +0 -0
  213. package/dist/fonts/source-serif-4/source-serif-4-variable-italic.woff2 +0 -0
  214. package/dist/fonts/source-serif-4/source-serif-4-variable-normal.woff2 +0 -0
  215. package/dist/fonts.css +43 -0
  216. package/dist/index.cjs +1 -0
  217. package/dist/index.d.ts +20 -0
  218. package/dist/index.d.ts.map +1 -0
  219. package/dist/index.mjs +3 -0
  220. package/dist/sample-imgs/event-img.jpg +0 -0
  221. package/dist/sample-imgs/news-img.jpg +0 -0
  222. package/dist/sample-imgs/page-img.jpg +0 -0
  223. package/dist/sample-imgs/people-img.jpg +0 -0
  224. package/dist/style.css +43 -0
  225. package/dist/styles/_parlour-variables.scss +83 -0
  226. package/dist/styles/c2b/parlour-tokens.d.ts +19 -0
  227. package/dist/styles/parlour-base-styles.css +72 -0
  228. package/dist/styles/parlour-base-styles.scss +72 -0
  229. package/dist/styles/parlour-layout.css +50 -0
  230. package/dist/styles/parlour-layout.scss +50 -0
  231. package/dist/styles/parlour-tokens.css +129 -0
  232. package/dist/styles/parlour-tokens.d.ts +19 -0
  233. package/dist/styles/parlour-tokens.js +148 -0
  234. package/dist/styles/parlour-tokens.scss +129 -0
  235. package/dist/styles/parlour-typography.css +29 -0
  236. package/dist/styles/parlour-typography.scss +29 -0
  237. package/dist/utils/propClasses.d.ts +101 -0
  238. package/dist/utils/propClasses.d.ts.map +1 -0
  239. package/dist/wordpress/block-theme.css +157 -0
  240. package/dist/wordpress/hybrid-theme.css +324 -0
  241. package/dist/wordpress/integrate.php +139 -0
  242. package/dist/wordpress/theme-parlour.json +581 -0
  243. 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}});