@refraction-ui/astro 0.13.0 → 0.15.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 (62) hide show
  1. package/dist/astro-audience-feature-card/AudienceFeatureCard.astro +53 -0
  2. package/dist/astro-audience-feature-card/index.ts +1 -0
  3. package/dist/astro-brand-network-cell/BrandNetworkCell.astro +77 -0
  4. package/dist/astro-brand-network-cell/index.ts +1 -0
  5. package/dist/astro-browser-chrome-mock/BrowserChromeMock.astro +62 -0
  6. package/dist/astro-browser-chrome-mock/index.ts +1 -0
  7. package/dist/astro-kanban-board/KanbanBoard.astro +92 -0
  8. package/dist/astro-kanban-board/index.ts +1 -0
  9. package/dist/astro-marquee-strip/MarqueeStrip.astro +63 -0
  10. package/dist/astro-marquee-strip/index.ts +1 -0
  11. package/dist/astro-mastery-bar/MasteryBar.astro +56 -0
  12. package/dist/astro-mastery-bar/index.ts +1 -0
  13. package/dist/astro-numbered-steps/NumberedSteps.astro +47 -0
  14. package/dist/astro-numbered-steps/index.ts +1 -0
  15. package/dist/astro-pricing-card/PricingCard.astro +114 -0
  16. package/dist/astro-pricing-card/index.ts +1 -0
  17. package/dist/astro-section-head/SectionHead.astro +44 -0
  18. package/dist/astro-section-head/index.ts +1 -0
  19. package/dist/astro-slot-picker/SlotPicker.astro +105 -0
  20. package/dist/astro-slot-picker/index.ts +1 -0
  21. package/dist/astro-sortable-list/SortableList.astro +68 -0
  22. package/dist/astro-sortable-list/index.ts +1 -0
  23. package/dist/astro-stat-grid/StatGrid.astro +46 -0
  24. package/dist/astro-stat-grid/index.ts +1 -0
  25. package/dist/audience-feature-card/audience-feature-card.styles.ts +23 -0
  26. package/dist/audience-feature-card/audience-feature-card.ts +39 -0
  27. package/dist/audience-feature-card/index.ts +13 -0
  28. package/dist/brand-network-cell/brand-network-cell.styles.ts +46 -0
  29. package/dist/brand-network-cell/brand-network-cell.ts +35 -0
  30. package/dist/brand-network-cell/index.ts +14 -0
  31. package/dist/browser-chrome-mock/browser-chrome-mock.styles.ts +43 -0
  32. package/dist/browser-chrome-mock/browser-chrome-mock.ts +52 -0
  33. package/dist/browser-chrome-mock/index.ts +17 -0
  34. package/dist/index.ts +12 -0
  35. package/dist/kanban-board/index.ts +20 -0
  36. package/dist/kanban-board/kanban-board.styles.ts +78 -0
  37. package/dist/kanban-board/kanban-board.ts +82 -0
  38. package/dist/marquee-strip/index.ts +14 -0
  39. package/dist/marquee-strip/marquee-strip.styles.ts +61 -0
  40. package/dist/marquee-strip/marquee-strip.ts +35 -0
  41. package/dist/mastery-bar/index.ts +15 -0
  42. package/dist/mastery-bar/mastery-bar.styles.ts +45 -0
  43. package/dist/mastery-bar/mastery-bar.ts +55 -0
  44. package/dist/numbered-steps/index.ts +16 -0
  45. package/dist/numbered-steps/numbered-steps.styles.ts +36 -0
  46. package/dist/numbered-steps/numbered-steps.ts +64 -0
  47. package/dist/pricing-card/index.ts +19 -0
  48. package/dist/pricing-card/pricing-card.styles.ts +71 -0
  49. package/dist/pricing-card/pricing-card.ts +37 -0
  50. package/dist/section-head/index.ts +13 -0
  51. package/dist/section-head/section-head.styles.ts +30 -0
  52. package/dist/section-head/section-head.ts +28 -0
  53. package/dist/slot-picker/index.ts +18 -0
  54. package/dist/slot-picker/slot-picker.styles.ts +70 -0
  55. package/dist/slot-picker/slot-picker.ts +64 -0
  56. package/dist/sortable-list/index.ts +13 -0
  57. package/dist/sortable-list/sortable-list.styles.ts +42 -0
  58. package/dist/sortable-list/sortable-list.ts +90 -0
  59. package/dist/stat-grid/index.ts +13 -0
  60. package/dist/stat-grid/stat-grid.styles.ts +25 -0
  61. package/dist/stat-grid/stat-grid.ts +41 -0
  62. package/package.json +13 -1
@@ -0,0 +1,105 @@
1
+ ---
2
+ import {
3
+ createSlotPicker,
4
+ slotsForDay,
5
+ isSlotSelected,
6
+ slotPickerVariants,
7
+ slotPickerDayRowClass,
8
+ slotPickerDayVariants,
9
+ slotPickerGridClass,
10
+ slotPickerSlotVariants,
11
+ slotPickerSectionLabelClass,
12
+ slotPickerTimezoneClass,
13
+ type SlotDay,
14
+ type SlotSelection,
15
+ } from '../slot-picker/index.ts'
16
+ import { cn } from '../shared/index.ts'
17
+
18
+ interface Props extends astroHTML.JSX.HTMLAttributes {
19
+ /** The list of days to show as chips. */
20
+ days: SlotDay[]
21
+ /** Map of dayId → available time slot strings. */
22
+ slotsByDay: Record<string, string[]>
23
+ /** The currently-selected day (determines which slots are shown). */
24
+ selectedDayId?: string
25
+ /** The full selection (day + slot) used to highlight the selected slot. */
26
+ value?: SlotSelection
27
+ /** Label shown beside the "Pick a time" heading (e.g. "Eastern Time"). */
28
+ timezoneLabel?: string
29
+ /** Slot strings that should be rendered as disabled. */
30
+ disabledSlots?: string[]
31
+ }
32
+
33
+ const {
34
+ days,
35
+ slotsByDay,
36
+ selectedDayId,
37
+ value,
38
+ timezoneLabel,
39
+ disabledSlots = [],
40
+ class: className,
41
+ ...rest
42
+ } = Astro.props
43
+
44
+ const currentSlots = selectedDayId ? slotsForDay(slotsByDay, selectedDayId) : []
45
+ const { ariaProps, dataAttributes } = createSlotPicker()
46
+ ---
47
+
48
+ <div class={cn(slotPickerVariants(), className)} {...ariaProps} {...dataAttributes} {...rest}>
49
+ <!-- Day row -->
50
+ <div>
51
+ <p class={slotPickerSectionLabelClass}>Pick a day</p>
52
+ <div role="radiogroup" aria-label="Pick a day" class={`${slotPickerDayRowClass} mt-2`}>
53
+ {
54
+ days.map((day) => {
55
+ const isSelected = selectedDayId === day.id
56
+ return (
57
+ <button
58
+ type="button"
59
+ role="radio"
60
+ aria-checked={isSelected}
61
+ data-state={isSelected ? 'checked' : 'unchecked'}
62
+ class={slotPickerDayVariants({ selected: isSelected ? 'true' : 'false' })}
63
+ >
64
+ <span class="text-xs">{day.weekday}</span>
65
+ <span class="text-base font-bold leading-none">{day.dayNum}</span>
66
+ </button>
67
+ )
68
+ })
69
+ }
70
+ </div>
71
+ </div>
72
+
73
+ <!-- Slot grid (only when a day is selected) -->
74
+ {selectedDayId && currentSlots.length > 0 && (
75
+ <div>
76
+ <p class={slotPickerSectionLabelClass}>
77
+ Pick a time
78
+ {timezoneLabel && <span class={slotPickerTimezoneClass}>{timezoneLabel}</span>}
79
+ </p>
80
+ <div role="radiogroup" aria-label="Pick a time" class={`${slotPickerGridClass} mt-2`}>
81
+ {
82
+ currentSlots.map((slot) => {
83
+ const isSlotActive = isSlotSelected(value, selectedDayId, slot)
84
+ const isDisabled = disabledSlots.includes(slot)
85
+ return (
86
+ <button
87
+ type="button"
88
+ role="radio"
89
+ aria-checked={isSlotActive}
90
+ aria-disabled={isDisabled || undefined}
91
+ data-state={isSlotActive ? 'checked' : 'unchecked'}
92
+ class={slotPickerSlotVariants({
93
+ selected: isSlotActive ? 'true' : 'false',
94
+ disabled: isDisabled ? 'true' : 'false',
95
+ })}
96
+ >
97
+ {slot}
98
+ </button>
99
+ )
100
+ })
101
+ }
102
+ </div>
103
+ </div>
104
+ )}
105
+ </div>
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,68 @@
1
+ ---
2
+ import {
3
+ createSortableList,
4
+ sortableListVariants,
5
+ sortableListRowVariants,
6
+ sortableListGripClass,
7
+ sortableListContentClass,
8
+ } from '../sortable-list/index.ts'
9
+ import { cn } from '../shared/index.ts'
10
+
11
+ interface Item {
12
+ /** Unique key for the item. */
13
+ id: string | number
14
+ /** Display label rendered as the row content. */
15
+ label: string
16
+ }
17
+
18
+ interface Props extends astroHTML.JSX.HTMLAttributes {
19
+ /** The ordered list of items to render. */
20
+ items: Item[]
21
+ /** Disables drag affordances visually. */
22
+ disabled?: boolean
23
+ }
24
+
25
+ const {
26
+ items,
27
+ disabled = false,
28
+ class: className,
29
+ ...rest
30
+ } = Astro.props
31
+
32
+ const { ariaProps, dataAttributes } = createSortableList()
33
+ ---
34
+
35
+ <div
36
+ class={cn(sortableListVariants({ disabled: disabled ? 'true' : 'false' }), className)}
37
+ {...ariaProps}
38
+ {...dataAttributes}
39
+ {...rest}
40
+ >
41
+ {
42
+ items.map((item) => (
43
+ <div
44
+ role="listitem"
45
+ class={sortableListRowVariants({ dragging: 'false' })}
46
+ >
47
+ {/* Grip handle — static in SSR; interactivity is React-only */}
48
+ <span class={sortableListGripClass} aria-hidden="true">
49
+ <svg
50
+ width="16"
51
+ height="16"
52
+ viewBox="0 0 16 16"
53
+ fill="none"
54
+ aria-hidden="true"
55
+ >
56
+ <path
57
+ d="M2 4h12M2 8h12M2 12h12"
58
+ stroke="currentColor"
59
+ stroke-width="1.5"
60
+ stroke-linecap="round"
61
+ />
62
+ </svg>
63
+ </span>
64
+ <span class={sortableListContentClass}>{item.label}</span>
65
+ </div>
66
+ ))
67
+ }
68
+ </div>
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,46 @@
1
+ ---
2
+ import {
3
+ createStatGrid,
4
+ statColumns,
5
+ statGridVariants,
6
+ statItemClass,
7
+ statValueClass,
8
+ statLabelClass,
9
+ type StatItem,
10
+ } from '../stat-grid/index.ts'
11
+ import { cn } from '../shared/index.ts'
12
+
13
+ interface Props extends astroHTML.JSX.HTMLAttributes {
14
+ /** The stat items to display in the grid (value and label as strings). */
15
+ items: StatItem[]
16
+ /**
17
+ * Number of columns. Defaults to statColumns(items.length):
18
+ * 1 item → 1, 2 items → 2, 3+ items → 3.
19
+ */
20
+ columns?: number
21
+ }
22
+
23
+ const { items, columns, class: className, ...rest } = Astro.props
24
+
25
+ const cols = columns ?? statColumns(items.length)
26
+ const colsKey = String(cols) as '1' | '2' | '3'
27
+ const { ariaProps, dataAttributes } = createStatGrid()
28
+ const gridStyle = `grid-template-columns:repeat(${cols}, 1fr)`
29
+ ---
30
+
31
+ <div
32
+ class={cn(statGridVariants({ columns: colsKey }), className)}
33
+ style={gridStyle}
34
+ {...ariaProps}
35
+ {...dataAttributes}
36
+ {...rest}
37
+ >
38
+ {
39
+ items.map((item) => (
40
+ <div role="listitem" class={statItemClass}>
41
+ <span class={statValueClass}>{item.value}</span>
42
+ <span class={statLabelClass}>{item.label}</span>
43
+ </div>
44
+ ))
45
+ }
46
+ </div>
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,23 @@
1
+ import { cva } from '../shared/index.ts'
2
+
3
+ /** Container — full-height flex column so footers align across a row. */
4
+ export const audienceFeatureCardVariants = cva({
5
+ base: 'flex h-full flex-col rounded-xl border border-border bg-card p-5',
6
+ variants: {},
7
+ defaultVariants: {},
8
+ })
9
+
10
+ /** Kicker text above the title. */
11
+ export const audienceFeatureCardKickerClass =
12
+ 'text-[10px] uppercase tracking-widest text-primary font-semibold'
13
+
14
+ /** Main title. */
15
+ export const audienceFeatureCardTitleClass =
16
+ 'mt-2 text-lg font-bold text-foreground'
17
+
18
+ /** Body copy. */
19
+ export const audienceFeatureCardBodyClass =
20
+ 'mt-1 text-sm text-muted-foreground leading-relaxed'
21
+
22
+ /** Footer area — pushed to bottom via mt-auto. */
23
+ export const audienceFeatureCardFooterClass = 'mt-auto pt-4 text-xs'
@@ -0,0 +1,39 @@
1
+ import type { AccessibilityProps } from '../shared/index.ts'
2
+
3
+ export interface AudienceFeatureCardProps {
4
+ /** Kicker text displayed above the title (e.g. "For teams"). */
5
+ kicker?: string
6
+ /** Main title — required. */
7
+ title: string
8
+ /** Body copy. */
9
+ body: string
10
+ /** Footer content (optional). */
11
+ footer?: string
12
+ }
13
+
14
+ export interface AudienceFeatureCardAPI {
15
+ /** ARIA attributes to spread on the group element (`role="group"`). */
16
+ ariaProps: Partial<AccessibilityProps>
17
+ /** Data attributes for styling hooks. */
18
+ dataAttributes: Record<string, string>
19
+ }
20
+
21
+ /**
22
+ * Build the framework-agnostic group props for an audience feature card.
23
+ *
24
+ * Returns `role="group"` plus data attributes; adapters spread these onto
25
+ * their container and render the kicker, title, body, and footer slots.
26
+ */
27
+ export function createAudienceFeatureCard(
28
+ _props: Partial<AudienceFeatureCardProps> = {},
29
+ ): AudienceFeatureCardAPI {
30
+ const ariaProps: Partial<AccessibilityProps> = {
31
+ role: 'group',
32
+ }
33
+
34
+ const dataAttributes: Record<string, string> = {
35
+ 'data-component': 'audience-feature-card',
36
+ }
37
+
38
+ return { ariaProps, dataAttributes }
39
+ }
@@ -0,0 +1,13 @@
1
+ export {
2
+ createAudienceFeatureCard,
3
+ type AudienceFeatureCardProps,
4
+ type AudienceFeatureCardAPI,
5
+ } from './audience-feature-card.js'
6
+
7
+ export {
8
+ audienceFeatureCardVariants,
9
+ audienceFeatureCardKickerClass,
10
+ audienceFeatureCardTitleClass,
11
+ audienceFeatureCardBodyClass,
12
+ audienceFeatureCardFooterClass,
13
+ } from './audience-feature-card.styles.js'
@@ -0,0 +1,46 @@
1
+ import { cva } from '../shared/index.ts'
2
+
3
+ /**
4
+ * Root card container. The `current` variant adds the primary ring that signals
5
+ * "You are here". Background and border come from semantic tokens so the card
6
+ * works in both light and dark themes without callers touching class names.
7
+ */
8
+ export const brandNetworkCellVariants = cva({
9
+ base: [
10
+ 'relative rounded-xl border border-border bg-card p-4',
11
+ 'flex flex-col gap-3 transition-shadow',
12
+ ].join(' '),
13
+ variants: {
14
+ current: {
15
+ true: 'ring-1 ring-primary',
16
+ false: '',
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ current: 'false',
21
+ },
22
+ })
23
+
24
+ /**
25
+ * Square glyph box — the brand monogram or icon.
26
+ * Background and text colour are caller-provided via inline `style` (brand
27
+ * tints vary per product); this class only controls geometry and typography.
28
+ */
29
+ export const brandNetworkCellGlyphClass =
30
+ 'flex size-10 items-center justify-center rounded-lg text-sm font-bold'
31
+
32
+ /** Domain / product name row. */
33
+ export const brandNetworkCellDomainClass = 'font-semibold text-foreground'
34
+
35
+ /**
36
+ * "You are here" badge shown beside the domain when `current` is true.
37
+ * Uses semantic token colours so it inherits the active theme automatically.
38
+ */
39
+ export const brandNetworkCellCurrentBadgeClass =
40
+ 'inline-flex items-center rounded-md bg-primary/10 px-2 py-0.5 text-xs font-medium text-primary'
41
+
42
+ /** Supporting body text below the domain. */
43
+ export const brandNetworkCellBodyClass = 'text-sm text-muted-foreground'
44
+
45
+ /** Inline link row rendered at the bottom of the card. */
46
+ export const brandNetworkCellLinkClass = 'text-sm text-primary'
@@ -0,0 +1,35 @@
1
+ import type { AccessibilityProps } from '../shared/index.ts'
2
+
3
+ export interface BrandNetworkCellProps {
4
+ /** Whether this cell represents the current/active product in the network. */
5
+ current?: boolean
6
+ }
7
+
8
+ export interface BrandNetworkCellAPI {
9
+ /** ARIA attributes to spread on the group element (`role="group"`). */
10
+ ariaProps: Partial<AccessibilityProps>
11
+ /** Data attributes for styling hooks. */
12
+ dataAttributes: Record<string, string>
13
+ }
14
+
15
+ /**
16
+ * Build the framework-agnostic group props for a brand network card.
17
+ *
18
+ * Returns `role="group"` plus a `data-current` attribute so adapters and
19
+ * consumers can style the "You are here" state without coupling to class names.
20
+ */
21
+ export function createBrandNetworkCell(
22
+ props: BrandNetworkCellProps = {},
23
+ ): BrandNetworkCellAPI {
24
+ const { current = false } = props
25
+
26
+ const ariaProps: Partial<AccessibilityProps> = {
27
+ role: 'group',
28
+ }
29
+
30
+ const dataAttributes: Record<string, string> = {
31
+ 'data-current': String(current),
32
+ }
33
+
34
+ return { ariaProps, dataAttributes }
35
+ }
@@ -0,0 +1,14 @@
1
+ export {
2
+ createBrandNetworkCell,
3
+ type BrandNetworkCellProps,
4
+ type BrandNetworkCellAPI,
5
+ } from './brand-network-cell.js'
6
+
7
+ export {
8
+ brandNetworkCellVariants,
9
+ brandNetworkCellGlyphClass,
10
+ brandNetworkCellDomainClass,
11
+ brandNetworkCellCurrentBadgeClass,
12
+ brandNetworkCellBodyClass,
13
+ brandNetworkCellLinkClass,
14
+ } from './brand-network-cell.styles.js'
@@ -0,0 +1,43 @@
1
+ import { cva } from '../shared/index.ts'
2
+
3
+ /** Outer frame wrapping the chrome bar and content. */
4
+ export const browserChromeMockVariants = cva({
5
+ base: 'rounded-xl border border-border overflow-hidden bg-card',
6
+ variants: {},
7
+ defaultVariants: {},
8
+ })
9
+
10
+ /** The chrome toolbar row containing dots, URL bar, and optional badge. */
11
+ export const chromeBarClass =
12
+ 'flex items-center gap-2 bg-muted/40 border-b border-border px-3 py-2'
13
+
14
+ /** A single traffic-light dot. */
15
+ export const trafficDotClass = 'size-2.5 rounded-full border border-border'
16
+
17
+ /** Centered URL bar. */
18
+ export const urlBarClass = 'flex-1 text-center font-mono text-[11px] text-muted-foreground'
19
+
20
+ /** Bold domain segment inside the URL bar. */
21
+ export const urlDomainClass = 'font-semibold text-foreground'
22
+
23
+ /**
24
+ * Status badge shown in the chrome bar.
25
+ *
26
+ * live → emerald tint (approved exception to semantic tokens)
27
+ * rec → destructive tint with a pulsing dot
28
+ */
29
+ export const statusBadgeVariants = cva({
30
+ base: 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide',
31
+ variants: {
32
+ status: {
33
+ live: 'text-emerald-500 bg-emerald-500/10',
34
+ rec: 'text-destructive bg-destructive/10',
35
+ },
36
+ },
37
+ defaultVariants: {
38
+ status: 'live',
39
+ },
40
+ })
41
+
42
+ /** Inner content area that receives slotted/children content. */
43
+ export const contentAreaClass = 'p-0'
@@ -0,0 +1,52 @@
1
+ /** Recording or live stream status for the browser chrome mock. */
2
+ export type BrowserChromeStatus = 'live' | 'rec'
3
+
4
+ export interface BrowserChromeMockProps {
5
+ /** URL to display in the address bar. */
6
+ url: string
7
+ /** Optional status badge shown in the chrome bar. */
8
+ status?: BrowserChromeStatus
9
+ }
10
+
11
+ export interface BrowserChromeMockAPI {
12
+ /** ARIA attributes to spread on the group element. */
13
+ ariaProps: { role: 'group'; 'aria-label': string }
14
+ /** Data attributes for styling hooks. */
15
+ dataAttributes: Record<string, string>
16
+ }
17
+
18
+ /** Split a URL into bold domain and normal path segments. */
19
+ export function splitUrl(url: string): { domain: string; path: string } {
20
+ const slashIndex = url.indexOf('/')
21
+ if (slashIndex === -1) {
22
+ return { domain: url, path: '' }
23
+ }
24
+ return {
25
+ domain: url.slice(0, slashIndex),
26
+ path: url.slice(slashIndex),
27
+ }
28
+ }
29
+
30
+ /**
31
+ * Build the framework-agnostic props for a BrowserChromeMock.
32
+ *
33
+ * Returns a `role="group"` aria label plus optional `data-status` so adapters
34
+ * can hook CSS without duplicating logic.
35
+ */
36
+ export function createBrowserChromeMock(
37
+ props: Pick<BrowserChromeMockProps, 'status'> = {},
38
+ ): BrowserChromeMockAPI {
39
+ const { status } = props
40
+
41
+ const ariaProps = {
42
+ role: 'group' as const,
43
+ 'aria-label': 'Browser preview',
44
+ }
45
+
46
+ const dataAttributes: Record<string, string> = {}
47
+ if (status !== undefined) {
48
+ dataAttributes['data-status'] = status
49
+ }
50
+
51
+ return { ariaProps, dataAttributes }
52
+ }
@@ -0,0 +1,17 @@
1
+ export {
2
+ createBrowserChromeMock,
3
+ splitUrl,
4
+ type BrowserChromeStatus,
5
+ type BrowserChromeMockProps,
6
+ type BrowserChromeMockAPI,
7
+ } from './browser-chrome-mock.js'
8
+
9
+ export {
10
+ browserChromeMockVariants,
11
+ chromeBarClass,
12
+ trafficDotClass,
13
+ urlBarClass,
14
+ urlDomainClass,
15
+ statusBadgeVariants,
16
+ contentAreaClass,
17
+ } from './browser-chrome-mock.styles.js'
package/dist/index.ts CHANGED
@@ -5,13 +5,16 @@ export * from './astro-ai/index.ts';
5
5
  export * from './astro-analytics/index.ts';
6
6
  export * from './astro-animated-text/index.ts';
7
7
  export * from './astro-app-shell/index.ts';
8
+ export * from './astro-audience-feature-card/index.ts';
8
9
  export * from './astro-audio-room/index.ts';
9
10
  export * from './astro-auth/index.ts';
10
11
  export * from './astro-avatar/index.ts';
11
12
  export * from './astro-avatar-group/index.ts';
12
13
  export * from './astro-badge/index.ts';
13
14
  export * from './astro-bottom-nav/index.ts';
15
+ export * from './astro-brand-network-cell/index.ts';
14
16
  export * from './astro-breadcrumbs/index.ts';
17
+ export * from './astro-browser-chrome-mock/index.ts';
15
18
  export * from './astro-button/index.ts';
16
19
  export * from './astro-calendar/index.ts';
17
20
  export * from './astro-call-controls/index.ts';
@@ -53,6 +56,7 @@ export * from './astro-inline-editor/index.ts';
53
56
  export * from './astro-input/index.ts';
54
57
  export * from './astro-input-group/index.ts';
55
58
  export * from './astro-install-prompt/index.ts';
59
+ export * from './astro-kanban-board/index.ts';
56
60
  export * from './astro-keyboard-shortcut/index.ts';
57
61
  export * from './astro-language-selector/index.ts';
58
62
  export * from './astro-link-card/index.ts';
@@ -61,9 +65,12 @@ export * from './astro-live-cursors/index.ts';
61
65
  export * from './astro-live-transcript/index.ts';
62
66
  export * from './astro-logger/index.ts';
63
67
  export * from './astro-markdown-renderer/index.ts';
68
+ export * from './astro-marquee-strip/index.ts';
69
+ export * from './astro-mastery-bar/index.ts';
64
70
  export * from './astro-mini-map/index.ts';
65
71
  export * from './astro-mobile-nav/index.ts';
66
72
  export * from './astro-navbar/index.ts';
73
+ export * from './astro-numbered-steps/index.ts';
67
74
  export * from './astro-otp-input/index.ts';
68
75
  export * from './astro-pagination/index.ts';
69
76
  export * from './astro-password-input/index.ts';
@@ -71,6 +78,7 @@ export * from './astro-payment/index.ts';
71
78
  export * from './astro-popover/index.ts';
72
79
  export * from './astro-pre-call-lobby/index.ts';
73
80
  export * from './astro-presence-indicator/index.ts';
81
+ export * from './astro-pricing-card/index.ts';
74
82
  export * from './astro-progress-display/index.ts';
75
83
  export * from './astro-radial-gauge/index.ts';
76
84
  export * from './astro-radio/index.ts';
@@ -79,6 +87,7 @@ export * from './astro-reaction-bar/index.ts';
79
87
  export * from './astro-resizable-layout/index.ts';
80
88
  export * from './astro-rich-editor/index.ts';
81
89
  export * from './astro-search-bar/index.ts';
90
+ export * from './astro-section-head/index.ts';
82
91
  export * from './astro-segmented-control/index.ts';
83
92
  export * from './astro-select/index.ts';
84
93
  export * from './astro-separator/index.ts';
@@ -87,7 +96,10 @@ export * from './astro-skeleton/index.ts';
87
96
  export * from './astro-skip-to-content/index.ts';
88
97
  export * from './astro-slide-viewer/index.ts';
89
98
  export * from './astro-slider/index.ts';
99
+ export * from './astro-slot-picker/index.ts';
90
100
  export * from './astro-social-auth-button/index.ts';
101
+ export * from './astro-sortable-list/index.ts';
102
+ export * from './astro-stat-grid/index.ts';
91
103
  export * from './astro-status-indicator/index.ts';
92
104
  export * from './astro-steps/index.ts';
93
105
  export * from './astro-sticky-note/index.ts';
@@ -0,0 +1,20 @@
1
+ export {
2
+ createKanbanBoard,
3
+ cardsByColumn,
4
+ visibleAndOverflow,
5
+ type KanbanColumnDef,
6
+ type KanbanBoardAPI,
7
+ } from './kanban-board.js'
8
+
9
+ export {
10
+ kanbanBoardVariants,
11
+ kanbanColumnVariants,
12
+ kanbanColumnHeaderClass,
13
+ kanbanColumnTitleClass,
14
+ kanbanColumnCountClass,
15
+ kanbanAccentBarClass,
16
+ kanbanNoteBarClass,
17
+ kanbanColumnBodyClass,
18
+ kanbanOverflowButtonClass,
19
+ kanbanCardVariants,
20
+ } from './kanban-board.styles.js'