@purestack/ts-components 1.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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/ts-components.d.mts +1662 -0
  4. package/dist/ts-components.d.mts.map +1 -0
  5. package/dist/ts-components.mjs +9200 -0
  6. package/dist/ts-components.mjs.map +1 -0
  7. package/package.json +130 -0
  8. package/src/defineComponents.ts +87 -0
  9. package/src/index.ts +270 -0
  10. package/src/registerStyles.ts +63 -0
  11. package/src/standard/alertBox/alertBox.ts +64 -0
  12. package/src/standard/autoId.ts +25 -0
  13. package/src/standard/badge/badge.ts +41 -0
  14. package/src/standard/badge/badgeStyle.ts +21 -0
  15. package/src/standard/barChart/barChart.ts +338 -0
  16. package/src/standard/barChart/barChartStyle.ts +81 -0
  17. package/src/standard/btn/btn.ts +191 -0
  18. package/src/standard/btn/btnStyle.ts +59 -0
  19. package/src/standard/btnGroup/btnGroup.ts +208 -0
  20. package/src/standard/btnGroup/btnGroupStyle.ts +85 -0
  21. package/src/standard/chart/cartesianChart.ts +99 -0
  22. package/src/standard/chart/chartDefaults.ts +25 -0
  23. package/src/standard/chart/chartUtils.ts +84 -0
  24. package/src/standard/classicLogo/classicLogo.ts +429 -0
  25. package/src/standard/classicLogo/classicLogoStyle.ts +292 -0
  26. package/src/standard/componentVariant.ts +153 -0
  27. package/src/standard/composer/composer.ts +1035 -0
  28. package/src/standard/composer/composerCanvasInitialStyle.ts +225 -0
  29. package/src/standard/composer/composerCanvasRevertStyle.ts +14 -0
  30. package/src/standard/composer/composerCanvasSharedStyle.ts +60 -0
  31. package/src/standard/composer/composerCanvasStyleTypes.ts +8 -0
  32. package/src/standard/composer/composerCanvasThemeStyle.ts +53 -0
  33. package/src/standard/composer/composerStyle.ts +156 -0
  34. package/src/standard/composer/emailHtmlPolicy.ts +474 -0
  35. package/src/standard/consent/consent.ts +173 -0
  36. package/src/standard/consent/consentStyle.ts +44 -0
  37. package/src/standard/contactForm/contactForm.ts +135 -0
  38. package/src/standard/contactForm/contactFormStyle.ts +116 -0
  39. package/src/standard/doughnutChart/doughnutChart.ts +527 -0
  40. package/src/standard/doughnutChart/doughnutChartStyle.ts +64 -0
  41. package/src/standard/dropFiles/dropFiles.ts +480 -0
  42. package/src/standard/dropFiles/dropFilesStyle.ts +171 -0
  43. package/src/standard/expandablePanel/expandablePanel.ts +106 -0
  44. package/src/standard/expandablePanel/expandablePanelStyle.ts +56 -0
  45. package/src/standard/flex/flex.ts +269 -0
  46. package/src/standard/flex/flexStyle.ts +556 -0
  47. package/src/standard/footer/footer.ts +93 -0
  48. package/src/standard/footer/footerStyle.ts +39 -0
  49. package/src/standard/form/autoCompleteInput.ts +567 -0
  50. package/src/standard/form/form.ts +205 -0
  51. package/src/standard/form/formCheck.ts +96 -0
  52. package/src/standard/form/formInputField.ts +184 -0
  53. package/src/standard/form/formSelectField.ts +152 -0
  54. package/src/standard/form/formStyle.ts +585 -0
  55. package/src/standard/form/multiAutoCompleteInput.ts +880 -0
  56. package/src/standard/grid/grid.ts +177 -0
  57. package/src/standard/grid/gridStyle.ts +56 -0
  58. package/src/standard/icon/icon.ts +96 -0
  59. package/src/standard/icon/iconStyle.ts +50 -0
  60. package/src/standard/landing/codeShowcase.ts +54 -0
  61. package/src/standard/landing/comparisonColumn.ts +30 -0
  62. package/src/standard/landing/comparisonFeature.ts +22 -0
  63. package/src/standard/landing/comparisonTable.ts +38 -0
  64. package/src/standard/landing/ctaSection.ts +59 -0
  65. package/src/standard/landing/featureCard.ts +41 -0
  66. package/src/standard/landing/landing.ts +52 -0
  67. package/src/standard/landing/landingBand.ts +217 -0
  68. package/src/standard/landing/landingSection.ts +43 -0
  69. package/src/standard/landing/landingTypes.ts +141 -0
  70. package/src/standard/landing/metricItem.ts +25 -0
  71. package/src/standard/landing/metricStrip.ts +20 -0
  72. package/src/standard/lineChart/lineChart.ts +462 -0
  73. package/src/standard/lineChart/lineChartStyle.ts +91 -0
  74. package/src/standard/logo/logo.ts +192 -0
  75. package/src/standard/logo/logoStyle.ts +164 -0
  76. package/src/standard/modal/modal.ts +171 -0
  77. package/src/standard/modal/modalStore.ts +154 -0
  78. package/src/standard/modal/modalStyle.ts +190 -0
  79. package/src/standard/navMenu/navMenu.ts +278 -0
  80. package/src/standard/navMenu/navMenuStyle.ts +323 -0
  81. package/src/standard/pageLinks/pageLinks.ts +90 -0
  82. package/src/standard/pageScript/pageScript.ts +155 -0
  83. package/src/standard/pageToc/pageToc.ts +154 -0
  84. package/src/standard/pageToc/pageTocStyle.ts +372 -0
  85. package/src/standard/panel/panel.ts +55 -0
  86. package/src/standard/panel/panelStyle.ts +15 -0
  87. package/src/standard/pricing/pricing.ts +146 -0
  88. package/src/standard/searchBox/searchBox.ts +54 -0
  89. package/src/standard/searchBox/searchBoxStyle.ts +180 -0
  90. package/src/standard/sectionHeader/sectionHeader.ts +99 -0
  91. package/src/standard/signIn/signIn.ts +167 -0
  92. package/src/standard/signIn/signInStyle.ts +70 -0
  93. package/src/standard/tabs/tabs.ts +193 -0
  94. package/src/standard/tabs/tabsStyle.ts +231 -0
  95. package/src/standard/themeToggle/themeToggle.ts +33 -0
  96. package/src/standard/themeToggle/themeToggleStyle.ts +88 -0
  97. package/src/standard/toast/toastHost.ts +42 -0
  98. package/src/standard/toast/toastStore.ts +50 -0
  99. package/src/standard/topBar/topBar.ts +101 -0
  100. package/src/standard/topBar/topBarStyle.ts +169 -0
  101. package/src/standard/virtualList/variableVirtualTable.ts +371 -0
  102. package/src/standard/virtualList/virtualList.ts +423 -0
  103. package/src/standard/virtualList/virtualListStyle.ts +34 -0
  104. package/src/standard/virtualList/virtualTable.ts +179 -0
  105. package/src/standard/virtualList/virtualTableStyle.ts +24 -0
  106. package/tsconfig.json +23 -0
@@ -0,0 +1,154 @@
1
+ import type { PageOutlineItem, TsSsgContext } from '@purestack/ts-common'
2
+ import { resolveTsSsgContext } from '@purestack/ts-common'
3
+ import type { SemanticTone } from '@purestack/ts-style'
4
+ import {
5
+ type ComputedRef,
6
+ computed,
7
+ defineComponent,
8
+ html,
9
+ type RefOrValue,
10
+ } from 'regor'
11
+ import {
12
+ type ComponentVariant,
13
+ type ComponentVariantMode,
14
+ resolveComponentClasses,
15
+ } from '../componentVariant'
16
+
17
+ export interface PageToc {
18
+ items?: PageOutlineItem[]
19
+ title?: string
20
+ tone?: RefOrValue<SemanticTone>
21
+ variant?: RefOrValue<ComponentVariant>
22
+ variantMode?: RefOrValue<ComponentVariantMode>
23
+ classes?: ComputedRef<string>
24
+ }
25
+
26
+ const DEFAULT_PAGE_TOC_VARIANT: ComponentVariant = 'flat'
27
+ const DEFAULT_PAGE_TOC_VARIANT_MODE: ComponentVariantMode = 'stateless'
28
+
29
+ export interface PageTocItem extends PageOutlineItem {
30
+ href: string
31
+ children?: PageTocItem[]
32
+ }
33
+
34
+ const pageTocTemplate = html`<nav
35
+ class="page-toc"
36
+ :class="classes"
37
+ aria-label="On this page"
38
+ >
39
+ <button
40
+ class="page-toc__panel-toggle tone-fill-button-all tone-text-button-all tone-border-button-all"
41
+ type="button"
42
+ aria-controls="doc-toc"
43
+ aria-expanded="false"
44
+ >
45
+ <span class="page-toc__panel-toggle-label">on this page</span>
46
+ </button>
47
+ <div class="page-toc__header-row">
48
+ <div class="page-toc__header">{{ title }}</div>
49
+ <button
50
+ class="page-toc__restore-toggle tone-text-button-all tone-fill-button-hover tone-fill-button-active tone-border-button-hover tone-border-button-active opacity-25 opacity-1-hover"
51
+ type="button"
52
+ title="Collapse table of contents"
53
+ aria-label="Collapse table of contents"
54
+ data-page-toc-restore
55
+ >
56
+ <span
57
+ class="page-toc__header-toggle-icon page-toc__header-toggle-icon--collapse p-1"
58
+ >
59
+ <Icon name="iconoir:pin-slash"/>
60
+ </span>
61
+ <span
62
+ class="page-toc__header-toggle-icon page-toc__header-toggle-icon--restore p-1"
63
+ >
64
+ <Icon name="iconoir:pin"/>
65
+ </span>
66
+ </button>
67
+ </div>
68
+ <ul class="page-toc__list" r-if="items.length > 0">
69
+ <li r-for="item in items" class="page-toc__item page-toc__item--h2">
70
+ <BtnLink
71
+ variant="link"
72
+ :href="item.href"
73
+ class="page-toc__link justify-start w-full ws-normal fw-400 fs-sm tone-fill-button-active tone-text-button-active py-1 pl-2"
74
+ >
75
+ {{ item.title }}
76
+ </BtnLink>
77
+ <ul
78
+ r-if="item.children && item.children.length > 0"
79
+ class="page-toc__list page-toc__list--nested"
80
+ >
81
+ <li
82
+ r-for="child in item.children"
83
+ class="page-toc__item page-toc__item--h3"
84
+ >
85
+ <BtnLink
86
+ variant="link"
87
+ :href="child.href"
88
+ class="page-toc__link page-toc__link--sub justify-start w-full ws-normal fw-200 fs-xs tone-fill-button-active tone-text-button-active py-1 pl-2"
89
+ >
90
+ {{ child.title }}
91
+ </BtnLink>
92
+ </li>
93
+ </ul>
94
+ </li>
95
+ </ul>
96
+ <div class="page-toc__empty" r-else>No sections yet.</div>
97
+ <script>
98
+ window.tsSsgPageToc?.hydrate(document.currentScript?.parentElement)
99
+ </script>
100
+ </nav>`
101
+
102
+ function toPageTocItems(items: PageOutlineItem[]): PageTocItem[] {
103
+ return items.map((item) => {
104
+ const { children, ...rest } = item
105
+ const mappedChildren = children ? toPageTocItems(children) : undefined
106
+ return {
107
+ ...rest,
108
+ href: `#${item.id}`,
109
+ ...(mappedChildren ? { children: mappedChildren } : {}),
110
+ }
111
+ })
112
+ }
113
+
114
+ function omitSingleDocumentHeading(items: PageOutlineItem[]) {
115
+ if (items.length !== 1) return items
116
+ const [item] = items
117
+ if (!item || item.depth !== 1) return items
118
+ return item.children ?? []
119
+ }
120
+
121
+ function resolveItems(props: PageToc, context: TsSsgContext | undefined) {
122
+ const items = props.items ?? context?.outline ?? []
123
+ return toPageTocItems(omitSingleDocumentHeading(items))
124
+ }
125
+
126
+ function resolveTitle(props: PageToc) {
127
+ return typeof props.title === 'string' && props.title.trim().length > 0
128
+ ? props.title.trim()
129
+ : 'On this page'
130
+ }
131
+
132
+ function definePageTocComponent() {
133
+ return defineComponent<PageToc>(pageTocTemplate, {
134
+ props: ['items', 'title', 'tone', 'variant', 'variantMode'],
135
+ context: (head) => {
136
+ const context = resolveTsSsgContext(head)
137
+ return {
138
+ title: resolveTitle(head.props),
139
+ classes: computed(() =>
140
+ resolveComponentClasses(head.props, {
141
+ defaultVariant: DEFAULT_PAGE_TOC_VARIANT,
142
+ defaultVariantMode: DEFAULT_PAGE_TOC_VARIANT_MODE,
143
+ }),
144
+ ),
145
+ items: resolveItems(head.props, context),
146
+ }
147
+ },
148
+ })
149
+ }
150
+
151
+ export function definePageTocComponents() {
152
+ const pageToc = definePageTocComponent()
153
+ return { pageToc }
154
+ }
@@ -0,0 +1,372 @@
1
+ import type { ThemePalette } from '@purestack/ts-style'
2
+ import {
3
+ BREAKPOINTS,
4
+ docLayoutVar,
5
+ mediaAbove,
6
+ mediaBelow,
7
+ mediaMax,
8
+ styleBuilder,
9
+ type ThemeMode,
10
+ themes,
11
+ } from '@purestack/ts-style'
12
+
13
+ export function registerPageTocStyles() {
14
+ themes.forEach((theme, palette) => {
15
+ registerPageTocShellStyles(theme, palette)
16
+ registerPageTocLinkStyles(theme)
17
+ registerPageTocTargetStyles(theme, palette)
18
+ registerPageTocLayoutStyles(theme, palette)
19
+ })
20
+ }
21
+
22
+ export function registerPageTocShellStyles(
23
+ theme: ThemeMode,
24
+ palette: ThemePalette,
25
+ ) {
26
+ styleBuilder
27
+ .select('.page-toc', theme)
28
+ .display('block')
29
+ .marginLeft(docLayoutVar('activeShellPaddingInlineEnd'))
30
+ .padding('1em')
31
+ .borderRadius(`${palette.radii.lg} !important`)
32
+ .border('1px solid transparent')
33
+ .apply(palette.applyFont(palette.font.size.body))
34
+ .maxHeight(`calc(100vh - ${docLayoutVar('sidebarTop')} - 1.5625rem)`)
35
+ .overflowY('auto')
36
+ .overflowX('hidden')
37
+ styleBuilder
38
+ .select('.page-toc__header-row', theme)
39
+ .display('flex')
40
+ .alignItems('center')
41
+ .justifyContent('space-between')
42
+ .gap('0.5em')
43
+ styleBuilder
44
+ .select('.page-toc__header', theme)
45
+ .apply(palette.applyFont(palette.font.size.xxs, palette.font.weight.w700))
46
+ .textTransform('uppercase')
47
+ .color(palette.current.text.subtle)
48
+ .opacity('0.5')
49
+ styleBuilder
50
+ .select('.page-toc__restore-toggle', theme)
51
+ .display('inline-flex')
52
+ .alignItems('center')
53
+ .justifyContent('center')
54
+ .padding('0.25em')
55
+ .background('transparent')
56
+ .border('transparent')
57
+ .borderRadius(palette.radii.md)
58
+ .cursor('pointer')
59
+ .transition('background 160ms ease, color 160ms ease')
60
+ .apply(palette.applyFont(palette.font.size.xxxs))
61
+ styleBuilder
62
+ .select('.page-toc__header-toggle-icon', theme)
63
+ .display('inline-flex')
64
+ .alignItems('center')
65
+ .justifyContent('center')
66
+ styleBuilder
67
+ .select('.page-toc__header-toggle-icon--restore', theme)
68
+ .display('none')
69
+ styleBuilder
70
+ .select(
71
+ '.template-doc--toc-collapsed .page-toc__header-toggle-icon--collapse',
72
+ theme,
73
+ )
74
+ .display('none')
75
+ styleBuilder
76
+ .select(
77
+ '.template-doc--toc-collapsed .page-toc__header-toggle-icon--restore',
78
+ theme,
79
+ )
80
+ .display('inline-flex')
81
+ styleBuilder
82
+ .select('.page-toc__header-toggle-icon svg', theme)
83
+ .display('block')
84
+ .fill('none')
85
+ .stroke('currentColor')
86
+ .strokeWidth('1.9')
87
+ .strokeLinecap('round')
88
+ .strokeLinejoin('round')
89
+ styleBuilder
90
+ .select('.page-toc__list', theme)
91
+ .listStyle('none')
92
+ .margin('0')
93
+ .padding('0')
94
+ .display('grid')
95
+ .gap('0.25em')
96
+ .overflow('hidden')
97
+ styleBuilder
98
+ .select('.page-toc__list--nested', theme)
99
+ .paddingLeft('0.75em')
100
+ .borderLeft(`1px solid ${palette.current.border.subtle}`)
101
+ styleBuilder.select('.page-toc__item', theme).display('grid')
102
+ styleBuilder
103
+ .select('.page-toc__empty', theme)
104
+ .apply(palette.applyFont(palette.font.size.xs, palette.font.weight.w600))
105
+ .color(palette.current.text.subtle)
106
+ styleBuilder.select('.page-toc__panel-toggle', theme).display('none')
107
+ styleBuilder
108
+ .select('.page-toc__restore-toggle', theme)
109
+ .media(mediaMax(BREAKPOINTS.toc))
110
+ .display('none')
111
+ }
112
+
113
+ export function registerPageTocLinkStyles(theme: ThemeMode) {
114
+ styleBuilder
115
+ .select('.page-toc__link', theme)
116
+ .transition('background 160ms ease, color 160ms ease')
117
+
118
+ styleBuilder.select('.page-toc__link--sub', theme).fontWeight('500')
119
+ }
120
+
121
+ export function registerPageTocTargetStyles(
122
+ theme: ThemeMode,
123
+ palette: ThemePalette,
124
+ ) {
125
+ styleBuilder
126
+ .select('.doc-content .page-toc__target', theme)
127
+ .scrollMarginTop('6rem')
128
+ .padding('0')
129
+ .borderRadius('0')
130
+ .transition('background 200ms ease, color 200ms ease')
131
+ styleBuilder
132
+ .select('.doc-content .page-toc__target', theme)
133
+ .boxShadow(`0 2px 0 0 ${palette.current.tone}`)
134
+ }
135
+
136
+ export function registerPageTocLayoutStyles(
137
+ theme: ThemeMode,
138
+ palette: ThemePalette,
139
+ ) {
140
+ registerPageTocShellGridStyles(theme)
141
+ registerPageTocSidebarBaseStyles(theme)
142
+ registerPageTocMobileOverlayStyles(theme, palette)
143
+ registerPageTocDesktopCollapsedStyles(theme)
144
+ }
145
+
146
+ function registerPageTocShellGridStyles(theme: ThemeMode) {
147
+ styleBuilder
148
+ .select('.doc-shell--toc', theme)
149
+ .gridTemplateColumns(
150
+ `${docLayoutVar('activeNavWidth')} minmax(0, 1fr) ${docLayoutVar('activeTocWidth')}`,
151
+ )
152
+ styleBuilder
153
+ .select('.doc-shell--toc-only', theme)
154
+ .gridTemplateColumns(`minmax(0, 1fr) ${docLayoutVar('activeTocWidth')}`)
155
+ styleBuilder
156
+ .select('.doc-shell--nav-drawer.doc-shell--toc', theme)
157
+ .gridTemplateColumns(`minmax(0, 1fr) ${docLayoutVar('activeTocWidth')}`)
158
+ styleBuilder
159
+ .select('.doc-shell--toc', theme)
160
+ .media(mediaMax(BREAKPOINTS.toc))
161
+ .gridTemplateColumns(`${docLayoutVar('activeNavWidth')} minmax(0, 1fr)`)
162
+ styleBuilder
163
+ .select(
164
+ '.doc-shell--toc-only, .doc-shell--nav-drawer.doc-shell--toc',
165
+ theme,
166
+ )
167
+ .media(mediaMax(BREAKPOINTS.toc))
168
+ .gridTemplateColumns('1fr')
169
+ styleBuilder
170
+ .select(
171
+ '.doc-shell--toc, .template-doc--toc-collapsed .doc-shell--toc',
172
+ theme,
173
+ )
174
+ .media(mediaBelow(BREAKPOINTS.lg))
175
+ .gridTemplateColumns('1fr !important')
176
+
177
+ styleBuilder
178
+ .select('.template-doc--toc-collapsed .doc-shell--toc', theme)
179
+ .gridTemplateColumns(`${docLayoutVar('activeNavWidth')} minmax(0, 1fr)`)
180
+ styleBuilder
181
+ .select('.template-doc--toc-collapsed .doc-shell--toc-only', theme)
182
+ .gridTemplateColumns('1fr')
183
+ styleBuilder
184
+ .select(
185
+ '.template-doc--toc-collapsed .doc-shell--nav-drawer.doc-shell--toc',
186
+ theme,
187
+ )
188
+ .gridTemplateColumns('1fr')
189
+ }
190
+
191
+ function registerPageTocSidebarBaseStyles(theme: ThemeMode) {
192
+ styleBuilder
193
+ .select('.doc-toc', theme)
194
+ .position('sticky')
195
+ .top(docLayoutVar('sidebarTop'))
196
+ .zIndex(30)
197
+ .alignSelf('start')
198
+ .maxHeight(`calc(100vh - ${docLayoutVar('sidebarTop')} - 1.5625rem)`)
199
+ .overflow('auto')
200
+ .userSelect('none')
201
+
202
+ styleBuilder
203
+ .select('.template-doc--has-toc .doc-toc', theme)
204
+ .media(mediaAbove(BREAKPOINTS.toc))
205
+ .overflow('visible')
206
+ .transformOrigin('right center')
207
+ .transform('translateX(0)')
208
+ .zIndex(30)
209
+ styleBuilder
210
+ .select(
211
+ '.template-doc.template-doc--nav-ready.template-doc--has-toc .doc-toc',
212
+ theme,
213
+ )
214
+ .transition('transform 260ms ease')
215
+ }
216
+
217
+ function registerPageTocMobileOverlayStyles(
218
+ theme: ThemeMode,
219
+ palette: ThemePalette,
220
+ ) {
221
+ styleBuilder
222
+ .select('.template-doc--has-toc .doc-toc', theme)
223
+ .media(mediaMax(BREAKPOINTS.lg))
224
+ .top(docLayoutVar('sidebarTopMobile'))
225
+ .height(`calc(100dvh - ${docLayoutVar('sidebarTopMobile')})`)
226
+ .maxHeight('none')
227
+ styleBuilder
228
+ .select('.template-doc--has-toc .doc-toc .page-toc', theme)
229
+ .media(mediaMax(BREAKPOINTS.lg))
230
+ .maxHeight(`calc(100dvh - ${docLayoutVar('sidebarTopMobile')})`)
231
+ styleBuilder
232
+ .select('.template-doc--has-toc .doc-toc', theme)
233
+ .media(mediaMax(BREAKPOINTS.toc))
234
+ .position('fixed')
235
+ .right('0')
236
+ .maxWidth('none')
237
+ .zIndex(140)
238
+ .overflow('hidden')
239
+ .background('transparent')
240
+ .boxShadow('none')
241
+ styleBuilder
242
+ .select('.template-doc--has-toc .doc-toc', theme)
243
+ .media(mediaMax(BREAKPOINTS.sm))
244
+ .width('100%')
245
+ styleBuilder
246
+ .select('.template-doc--has-toc .doc-toc.doc-toc--open', theme)
247
+ .media(mediaMax(BREAKPOINTS.toc))
248
+ .transform('translateX(0)')
249
+ .overflowY('auto')
250
+ .overflowX('hidden')
251
+ .webkitOverflowScrolling('touch')
252
+ styleBuilder
253
+ .select('.template-doc--has-toc .doc-toc:not(.doc-toc--open)', theme)
254
+ .media(mediaMax(BREAKPOINTS.toc))
255
+ .width(docLayoutVar('activeRailWidth'))
256
+ .right('0')
257
+ .left('auto')
258
+ .transform(`translateX(calc(100% - ${docLayoutVar('activeRailWidth')}))`)
259
+ .background('transparent')
260
+ .boxShadow('none')
261
+ .pointerEvents('none')
262
+ styleBuilder
263
+ .select('.template-doc--has-toc.doc-toc-open', theme)
264
+ .media(mediaMax(BREAKPOINTS.sm))
265
+ .overflow('hidden')
266
+
267
+ styleBuilder
268
+ .select('.template-doc--has-toc.doc-toc-open', theme)
269
+ .media(mediaMax(BREAKPOINTS.sm))
270
+ .overflow('hidden')
271
+
272
+ styleBuilder
273
+ .select(
274
+ '.template-doc--has-toc .doc-toc:not(.doc-toc--open) .page-toc',
275
+ theme,
276
+ )
277
+ .media(mediaMax(BREAKPOINTS.toc))
278
+ .background('transparent')
279
+ .border('none !important')
280
+ .boxShadow('none')
281
+
282
+ styleBuilder
283
+ .select('.template-doc--has-toc .page-toc__panel-toggle', theme)
284
+ .media(mediaMax(BREAKPOINTS.toc))
285
+ .position('absolute')
286
+ .left('0')
287
+ .right('auto')
288
+ styleBuilder
289
+ .select('.page-toc__panel-toggle', theme)
290
+ .height('7.5rem')
291
+ .writingMode('vertical-rl')
292
+ .textOrientation('mixed')
293
+ .width(docLayoutVar('activeRailWidth'))
294
+ .transform('rotate(180deg)')
295
+ .bottom('5rem')
296
+ .apply(palette.applyFont(palette.font.size.xxxs, palette.font.weight.w700))
297
+ .border(`1px solid ${palette.current.border.default}`)
298
+ .borderLeft('none')
299
+ .borderRadius(`0 ${palette.radii.md} ${palette.radii.md} 0`)
300
+ .pointerEvents('auto')
301
+ .zIndex(2)
302
+ .userSelect('none')
303
+ .cursor('pointer')
304
+ .display('flex')
305
+ .alignItems('center')
306
+ .justifyContent('center')
307
+ .textTransform('uppercase')
308
+ .position('fixed')
309
+
310
+ styleBuilder
311
+ .select(
312
+ '.template-doc--has-toc .doc-toc:not(.doc-toc--open) .page-toc > :not(.page-toc__panel-toggle)',
313
+ theme,
314
+ )
315
+ .media(mediaMax(BREAKPOINTS.toc))
316
+ .visibility('hidden')
317
+ styleBuilder
318
+ .select(
319
+ '.template-doc--has-toc .doc-toc.doc-toc--open .page-toc__panel-toggle',
320
+ theme,
321
+ )
322
+ .display('none')
323
+ }
324
+
325
+ function registerPageTocDesktopCollapsedStyles(theme: ThemeMode) {
326
+ styleBuilder
327
+ .select('.template-doc--toc-collapsed .doc-toc', theme)
328
+ .media(mediaAbove(BREAKPOINTS.toc))
329
+ .width(docLayoutVar('activeRailWidth'))
330
+ .position('fixed')
331
+ .top(docLayoutVar('sidebarTop'))
332
+ .right('0')
333
+ .left('auto')
334
+ .height(`calc(100dvh - ${docLayoutVar('sidebarTop')})`)
335
+ .maxHeight('none')
336
+ .background('transparent')
337
+ .boxShadow('none')
338
+ .overflow('visible')
339
+ .transform(`translateX(calc(100% - ${docLayoutVar('activeRailWidth')}))`)
340
+ .zIndex(140)
341
+ styleBuilder
342
+ .select('.doc-toc.doc-toc--open', theme)
343
+ .media(mediaAbove(BREAKPOINTS.md))
344
+ .width(docLayoutVar('preferredTocWidth'))
345
+ .background('transparent')
346
+ .boxShadow('none')
347
+ .transform('translateX(0)')
348
+ styleBuilder
349
+ .select('.page-toc', theme)
350
+ .media(mediaBelow(BREAKPOINTS.md))
351
+ .marginInlineStart('0')
352
+ .borderRadius('0 !important')
353
+ styleBuilder
354
+ .select(
355
+ '.template-doc--toc-collapsed .doc-toc:not(.doc-toc--open) .page-toc__header, .template-doc--toc-collapsed .doc-toc:not(.doc-toc--open) .page-toc__restore-toggle, .template-doc--toc-collapsed .doc-toc:not(.doc-toc--open) .page-toc__list, .template-doc--toc-collapsed .doc-toc:not(.doc-toc--open) .page-toc__empty',
356
+ theme,
357
+ )
358
+ .media(mediaAbove(BREAKPOINTS.toc))
359
+ .display('none')
360
+ styleBuilder
361
+ .select(
362
+ '.template-doc--toc-collapsed .doc-toc:not(.doc-toc--open) .page-toc',
363
+ theme,
364
+ )
365
+ .width(docLayoutVar('activeRailWidth'))
366
+ .marginLeft('0')
367
+ .padding('0')
368
+ .background('transparent')
369
+ .border('none !important')
370
+ .borderRadius('0 !important')
371
+ .overflow('visible')
372
+ }
@@ -0,0 +1,55 @@
1
+ import type { SemanticTone } from '@purestack/ts-style'
2
+ import {
3
+ type ComputedRef,
4
+ computed,
5
+ defineComponent,
6
+ html,
7
+ type RefOrValue,
8
+ } from 'regor'
9
+ import {
10
+ type ComponentVariant,
11
+ type ComponentVariantMode,
12
+ resolveComponentClasses,
13
+ } from '../componentVariant'
14
+
15
+ export interface Panel {
16
+ tone?: RefOrValue<SemanticTone>
17
+ variant?: RefOrValue<ComponentVariant>
18
+ variantMode?: RefOrValue<ComponentVariantMode>
19
+ bodyClass?: RefOrValue<string>
20
+ classes?: ComputedRef<string>
21
+ }
22
+
23
+ const DEFAULT_PANEL_VARIANT: ComponentVariant = 'surface'
24
+ const DEFAULT_PANEL_VARIANT_MODE: ComponentVariantMode = 'stateless'
25
+
26
+ const panelTemplate = html`<section class="panel tone-text" :class="classes">
27
+ <div class="panel__body" :class="bodyClass">
28
+ <slot></slot>
29
+ </div>
30
+ </section>`
31
+
32
+ function definePanelComponent() {
33
+ return defineComponent<Panel>(panelTemplate, {
34
+ props: ['tone', 'variant', 'variantMode', 'bodyClass'],
35
+ context: (head) => resolvePanel(head.props),
36
+ })
37
+ }
38
+
39
+ export function definePanelComponents() {
40
+ return {
41
+ panel: definePanelComponent(),
42
+ }
43
+ }
44
+
45
+ function resolvePanel(props: Panel): Panel {
46
+ return {
47
+ ...props,
48
+ classes: computed(() =>
49
+ resolveComponentClasses(props, {
50
+ defaultVariant: DEFAULT_PANEL_VARIANT,
51
+ defaultVariantMode: DEFAULT_PANEL_VARIANT_MODE,
52
+ }),
53
+ ),
54
+ }
55
+ }
@@ -0,0 +1,15 @@
1
+ import { styleBuilder, themes } from '@purestack/ts-style'
2
+
3
+ export function registerPanelStyles() {
4
+ themes.forEach((theme, palette) => {
5
+ styleBuilder
6
+ .select('.panel', theme)
7
+ .display('grid')
8
+ .padding('1em')
9
+ .boxShadow(palette.effect.panelShadow)
10
+ .overflow('hidden')
11
+ .transition(
12
+ 'border-color 180ms ease, box-shadow 180ms ease, background 180ms ease',
13
+ )
14
+ })
15
+ }