ruler-components 0.1.1 → 0.1.3

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 (118) hide show
  1. package/dist/index.d.mts +458 -0
  2. package/dist/index.d.ts +458 -0
  3. package/dist/index.js +3618 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +3467 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +21 -2
  8. package/AGENTS.md +0 -9
  9. package/CLAUDE.md +0 -1
  10. package/app/docs/[slug]/page.tsx +0 -147
  11. package/app/docs/layout.tsx +0 -26
  12. package/app/docs/page.tsx +0 -148
  13. package/app/favicon.ico +0 -0
  14. package/app/globals.css +0 -168
  15. package/app/icon.png +0 -0
  16. package/app/layout.tsx +0 -90
  17. package/app/opengraph-image.tsx +0 -10
  18. package/app/page.tsx +0 -34
  19. package/app/twitter-image.tsx +0 -10
  20. package/components/docs/accordion-doc-page.tsx +0 -352
  21. package/components/docs/alert-doc-page.tsx +0 -293
  22. package/components/docs/allinput-doc-page.tsx +0 -183
  23. package/components/docs/avatar-doc-page.tsx +0 -424
  24. package/components/docs/badge-doc-page.tsx +0 -363
  25. package/components/docs/button-doc-page.tsx +0 -406
  26. package/components/docs/card-doc-page.tsx +0 -364
  27. package/components/docs/checkbox-doc-page.tsx +0 -277
  28. package/components/docs/colors-doc-page.tsx +0 -430
  29. package/components/docs/dialog-doc-page.tsx +0 -364
  30. package/components/docs/docs-footer.tsx +0 -11
  31. package/components/docs/docs-mobile-menu-bar.tsx +0 -22
  32. package/components/docs/docs-mobile-nav-context.tsx +0 -27
  33. package/components/docs/docs-page.tsx +0 -263
  34. package/components/docs/docs-search.tsx +0 -303
  35. package/components/docs/docs-sidebar.tsx +0 -165
  36. package/components/docs/docs-topbar.tsx +0 -32
  37. package/components/docs/dropdown-doc-page.tsx +0 -522
  38. package/components/docs/getting-started-doc-page.tsx +0 -205
  39. package/components/docs/label-doc-page.tsx +0 -173
  40. package/components/docs/loaders-doc-page.tsx +0 -244
  41. package/components/docs/menu-doc-page.tsx +0 -373
  42. package/components/docs/modal-doc-page.tsx +0 -436
  43. package/components/docs/next-steps.tsx +0 -53
  44. package/components/docs/pagination-doc-page.tsx +0 -316
  45. package/components/docs/progress-doc-page.tsx +0 -387
  46. package/components/docs/radio-doc-page.tsx +0 -270
  47. package/components/docs/skeleton-doc-page.tsx +0 -230
  48. package/components/docs/stepper-doc-page.tsx +0 -309
  49. package/components/docs/switch-doc-page.tsx +0 -264
  50. package/components/docs/table-doc-page.tsx +0 -689
  51. package/components/docs/tabs-doc-page.tsx +0 -359
  52. package/components/docs/theming-doc-page.tsx +0 -243
  53. package/components/docs/tooltip-doc-page.tsx +0 -357
  54. package/components/docs/usage-section.tsx +0 -21
  55. package/components/icons/discord.tsx +0 -9
  56. package/components/icons/github.tsx +0 -9
  57. package/components/icons/x.tsx +0 -9
  58. package/components/installation-section.tsx +0 -34
  59. package/components/landing/feature-highlights.tsx +0 -105
  60. package/components/landing/footer-strip.tsx +0 -45
  61. package/components/landing/hero-card.tsx +0 -14
  62. package/components/landing/hero-spotlight.tsx +0 -126
  63. package/components/landing/hero.tsx +0 -64
  64. package/components/landing/navbar.tsx +0 -44
  65. package/components/landing/quick-start-section.tsx +0 -59
  66. package/components/landing/site-footer.tsx +0 -55
  67. package/components/theme-provider.tsx +0 -60
  68. package/components/ui/accordion.tsx +0 -174
  69. package/components/ui/alert.tsx +0 -103
  70. package/components/ui/allinput.tsx +0 -210
  71. package/components/ui/avatar.tsx +0 -179
  72. package/components/ui/badge.tsx +0 -52
  73. package/components/ui/button.tsx +0 -75
  74. package/components/ui/card.tsx +0 -105
  75. package/components/ui/checkbox.tsx +0 -130
  76. package/components/ui/code-block.tsx +0 -60
  77. package/components/ui/data-table.tsx +0 -235
  78. package/components/ui/dialog.tsx +0 -173
  79. package/components/ui/dropdown.tsx +0 -78
  80. package/components/ui/feature-card.tsx +0 -38
  81. package/components/ui/input.tsx +0 -44
  82. package/components/ui/label.tsx +0 -110
  83. package/components/ui/loaders.tsx +0 -139
  84. package/components/ui/menu.tsx +0 -118
  85. package/components/ui/modal.tsx +0 -399
  86. package/components/ui/package-manager-tabs.tsx +0 -40
  87. package/components/ui/pagination.tsx +0 -200
  88. package/components/ui/progress.tsx +0 -134
  89. package/components/ui/radio.tsx +0 -262
  90. package/components/ui/skeleton.tsx +0 -102
  91. package/components/ui/steppers.tsx +0 -309
  92. package/components/ui/switch.tsx +0 -153
  93. package/components/ui/table.tsx +0 -58
  94. package/components/ui/tabs.tsx +0 -166
  95. package/components/ui/theme-toggle.tsx +0 -60
  96. package/components/ui/tooltip.tsx +0 -238
  97. package/data/color-palette.ts +0 -35
  98. package/data/docs-nav.ts +0 -84
  99. package/eslint.config.mjs +0 -18
  100. package/index.ts +0 -8
  101. package/lib/cn.ts +0 -4
  102. package/lib/color.ts +0 -85
  103. package/lib/og-image.tsx +0 -138
  104. package/lib/theme.ts +0 -33
  105. package/next.config.ts +0 -7
  106. package/postcss.config.mjs +0 -7
  107. package/public/dark.png +0 -0
  108. package/public/dark1.png +0 -0
  109. package/public/dark2.png +0 -0
  110. package/public/file.svg +0 -1
  111. package/public/globe.svg +0 -1
  112. package/public/light.png +0 -0
  113. package/public/light1.png +0 -0
  114. package/public/next.svg +0 -1
  115. package/public/vercel.svg +0 -1
  116. package/public/video/hero-demo.mp4 +0 -0
  117. package/public/window.svg +0 -1
  118. package/tsconfig.json +0 -34
@@ -1,147 +0,0 @@
1
- import { notFound } from "next/navigation";
2
- import { Construction } from "lucide-react";
3
- import { DOCS_NAV } from "@/data/docs-nav";
4
- import { DocsPage as DocsPageLayout, DocsPageHeader, DocsSection } from "@/components/docs/docs-page";
5
- import { AlertDocPage } from "@/components/docs/alert-doc-page";
6
- import { AvatarDocPage } from "@/components/docs/avatar-doc-page";
7
- import { BadgeDocPage } from "@/components/docs/badge-doc-page";
8
- import { ButtonDocPage } from "@/components/docs/button-doc-page";
9
- import { CardDocPage } from "@/components/docs/card-doc-page";
10
- import { CheckboxDocPage } from "@/components/docs/checkbox-doc-page";
11
- import { LabelDocPage } from "@/components/docs/label-doc-page";
12
- import { MenuDocPage } from "@/components/docs/menu-doc-page";
13
- import { ModalDocPage } from "@/components/docs/modal-doc-page";
14
- import { ProgressDocPage } from "@/components/docs/progress-doc-page";
15
- import { RadioDocPage } from "@/components/docs/radio-doc-page";
16
- import { SwitchDocPage } from "@/components/docs/switch-doc-page";
17
- import { TooltipDocPage } from "@/components/docs/tooltip-doc-page";
18
- import { AccordionDocPage } from "@/components/docs/accordion-doc-page";
19
- import { SkeletonDocPage } from "@/components/docs/skeleton-doc-page";
20
- import { DialogDocPage } from "@/components/docs/dialog-doc-page";
21
- import { TableDocPage } from "@/components/docs/table-doc-page";
22
- import { DropdownDocPage } from "@/components/docs/dropdown-doc-page";
23
- import { InputDocPage } from "@/components/docs/allinput-doc-page";
24
- import { TabsDocPage } from "@/components/docs/tabs-doc-page";
25
- import { PaginationDocPage } from "@/components/docs/pagination-doc-page";
26
- import { LoadersDocPage } from "@/components/docs/loaders-doc-page";
27
- import { StepperDocPage } from "@/components/docs/stepper-doc-page";
28
- import { ColorsDocPage } from "@/components/docs/colors-doc-page";
29
- import { ThemingDocPage } from "@/components/docs/theming-doc-page";
30
- import { GettingStartedDocPage } from "@/components/docs/getting-started-doc-page";
31
-
32
-
33
-
34
- export default async function DocsPage({
35
- params,
36
- }: {
37
- params: Promise<{ slug: string }>;
38
- }) {
39
- const { slug } = await params;
40
-
41
- const item = DOCS_NAV.flatMap((group) => group.items).find(
42
- (entry) => entry.slug === slug,
43
- );
44
-
45
- if (!item) notFound();
46
-
47
- switch (slug) {
48
- case "alert":
49
- return <AlertDocPage />;
50
-
51
- case "avatar":
52
- return <AvatarDocPage />;
53
-
54
- case "badge":
55
- return <BadgeDocPage />;
56
-
57
- case "button":
58
- return <ButtonDocPage />;
59
-
60
- case "card":
61
- return <CardDocPage />;
62
-
63
- case "checkbox":
64
- return <CheckboxDocPage />;
65
-
66
- case "label":
67
- return <LabelDocPage />;
68
-
69
- case "menu":
70
- return <MenuDocPage />;
71
-
72
- case "modal":
73
- return <ModalDocPage />;
74
-
75
- case "progress":
76
- return <ProgressDocPage />;
77
-
78
- case "radio":
79
- return <RadioDocPage />;
80
-
81
- case "switch":
82
- return <SwitchDocPage />;
83
-
84
- case "tooltip":
85
- return <TooltipDocPage />;
86
-
87
- case "accordion":
88
- return <AccordionDocPage />;
89
-
90
- case "skeleton":
91
- return <SkeletonDocPage />;
92
-
93
- case "dialog":
94
- return <DialogDocPage />;
95
-
96
- case "table":
97
- return <TableDocPage />;
98
-
99
- case "dropdown":
100
- return <DropdownDocPage />;
101
-
102
- case "input":
103
- return <InputDocPage />;
104
-
105
- case "tabs":
106
- return <TabsDocPage />;
107
-
108
- case "pagination":
109
- return <PaginationDocPage />;
110
-
111
- case "loader":
112
- return <LoadersDocPage />;
113
-
114
- case "stepper":
115
- return <StepperDocPage />;
116
-
117
- case "colors":
118
- return <ColorsDocPage />;
119
-
120
- case "theming":
121
- return <ThemingDocPage />;
122
-
123
- case "getting-started":
124
- return <GettingStartedDocPage />;
125
-
126
-
127
-
128
- }
129
-
130
- return (
131
- <DocsPageLayout>
132
- <DocsPageHeader
133
- icon={item.icon}
134
- title={item.title}
135
- description={`Documentation for the ${item.title} component is coming soon.`}
136
- />
137
- <DocsSection
138
- contentClassName="flex flex-col items-center gap-3 rounded-xl border border-dashed border-zinc-300 py-16 text-center dark:border-zinc-700"
139
- >
140
- <Construction className="h-6 w-6 text-zinc-400" />
141
- <p className="text-sm text-zinc-500 dark:text-zinc-400">
142
- The {item.title} docs page is coming soon.
143
- </p>
144
- </DocsSection>
145
- </DocsPageLayout>
146
- );
147
- }
@@ -1,26 +0,0 @@
1
- import type { ReactNode } from "react";
2
- import { DocsTopbar } from "@/components/docs/docs-topbar";
3
- import { DocsSidebar } from "@/components/docs/docs-sidebar";
4
- import { DocsFooter } from "@/components/docs/docs-footer";
5
- import { DocsMobileNavProvider } from "@/components/docs/docs-mobile-nav-context";
6
- import { DocsMobileMenuBar } from "@/components/docs/docs-mobile-menu-bar";
7
-
8
- export default function DocsLayout({ children }: { children: ReactNode }) {
9
- return (
10
- <DocsMobileNavProvider>
11
- <div className="docs-shell-glow relative min-h-screen bg-white dark:bg-zinc-950" id="docs-shell">
12
- <DocsTopbar />
13
- <DocsMobileMenuBar />
14
- <div className="flex min-w-0">
15
- <DocsSidebar />
16
- <div className="relative z-10 min-w-0 flex-1 overflow-x-clip px-4 py-8 sm:px-10 sm:py-10 xl:px-16 2xl:px-24">
17
- {children}
18
- <div className="mx-auto max-w-5xl">
19
- <DocsFooter />
20
- </div>
21
- </div>
22
- </div>
23
- </div>
24
- </DocsMobileNavProvider>
25
- );
26
- }
package/app/docs/page.tsx DELETED
@@ -1,148 +0,0 @@
1
- import Link from "next/link";
2
- import { Rocket, ShieldCheck, SwatchBook, Wand2 } from "lucide-react";
3
- import { Badge } from "@/components/ui/badge";
4
- import { InstallationSection } from "@/components/installation-section";
5
- import { UsageSection } from "@/components/docs/usage-section";
6
- import { NextSteps } from "@/components/docs/next-steps";
7
- import { DocsPage, DocsPageHeader, DocsSection } from "@/components/docs/docs-page";
8
- import { DOCS_NAV } from "@/data/docs-nav";
9
-
10
- const COMPONENT_COUNT = DOCS_NAV[0].items.filter((item) => item.slug).length;
11
-
12
- export default function DocsIntroductionPage() {
13
- return (
14
- <DocsPage>
15
- {/* --- NEW HEADER SECTION (Based on Image) --- */}
16
- <div className="mb-10 space-y-3">
17
- <h1 className="text-3xl font-bold tracking-tight text-zinc-900 dark:text-white">
18
- Welcome to ruler.ui
19
- </h1>
20
- <p className="max-w-3xl text-[16px] leading-relaxed text-zinc-600 dark:text-zinc-400">
21
- ruler.ui is a collective resource of global UI design patterns and components,
22
- to help maintain a cohesive user experience across all of your products and applications.
23
- </p>
24
- </div>
25
-
26
- {/* --- STATS ROW --- */}
27
- <div className="mt-6 flex flex-wrap items-center gap-3">
28
- {/* Component Count Badge */}
29
- <div className="inline-flex items-center rounded-md border border-zinc-200 bg-white px-3 py-1.5 text-sm text-zinc-600 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-400">
30
- <span className="mr-1 font-semibold text-zinc-900 dark:text-white">{COMPONENT_COUNT}</span>
31
- components
32
- </div>
33
-
34
- {/* TypeScript Badge */}
35
- <div className="inline-flex items-center rounded-md border border-zinc-200 bg-white px-3 py-1.5 text-sm text-zinc-600 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-400">
36
- Written in TypeScript
37
- </div>
38
-
39
- {/* Accessibility Badge */}
40
- <div className="inline-flex items-center rounded-md border border-zinc-200 bg-white px-3 py-1.5 text-sm text-zinc-600 dark:border-zinc-800 dark:bg-zinc-950 dark:text-zinc-400">
41
- WAI-ARIA accessible
42
- </div>
43
- </div>
44
-
45
- {/* --- HOW IT WORKS SECTION (Based on Image) --- */}
46
- <div className="relative my-8">
47
- <div className="relative overflow-hidden border rounded-md border-zinc-200 bg-white dark:border-zinc-800 dark:bg-zinc-950">
48
-
49
- {/* TOP-LEFT SLANTED ACCENT */}
50
- <div
51
- className="absolute left-0 top-0 h-[5px] w-24 bg-black"
52
- style={{
53
- clipPath: "polygon(0 0, 100% 0, 90% 100%, 0 100%)",
54
- }}
55
- />
56
-
57
- {/* BOTTOM-RIGHT SLANTED ACCENT */}
58
- <div
59
- className="absolute bottom-0 right-0 h-[5px] w-24 bg-black"
60
- style={{
61
- clipPath: "polygon(10% 0, 100% 0, 100% 100%, 0 100%)",
62
- }}
63
- />
64
-
65
- <div className="px-6 py-5 md:px-7 md:py-6">
66
- <h2 className="mb-4 text-[16px] leading-relaxed text-zinc-600 dark:text-zinc-400">
67
- How It Works
68
- </h2>
69
-
70
- <div>
71
- {/* Feature 1 */}
72
- <div className="pb-4">
73
- <p className="text-[14px] leading-6 text-zinc-700 dark:text-zinc-300">
74
- <span className="font-bold text-zinc-900 dark:text-white">
75
- Simple access
76
- </span>{" "}
77
- to universal and reusable components & patterns available whenever
78
- you need them.
79
- </p>
80
- </div>
81
-
82
- <div className="border-t border-dashed border-zinc-200 dark:border-zinc-800" />
83
-
84
- {/* Feature 2 */}
85
- <div className="py-4">
86
- <p className="text-[14px] leading-6 text-zinc-700 dark:text-zinc-300">
87
- <span className="font-bold text-zinc-900 dark:text-white">
88
- Instructions and guidance
89
- </span>{" "}
90
- to help you understand how elements are intended to behave, what
91
- they look like and how they are coded.
92
- </p>
93
- </div>
94
-
95
- <div className="border-t border-dashed border-zinc-200 dark:border-zinc-800" />
96
-
97
- {/* Feature 3 */}
98
- <div className="pt-4">
99
- <p className="text-[14px] leading-6 text-zinc-700 dark:text-zinc-300">
100
- {" "}
101
- <span className="font-bold text-zinc-900 dark:text-white">
102
- dedicated team
103
- </span>{" "}
104
- of designers and developers who manage the UI library and are here
105
- to provide assistance when needed.
106
- </p>
107
- </div>
108
- </div>
109
- </div>
110
- </div>
111
- </div>
112
-
113
- {/* --- ORIGINAL REMAINING SECTIONS (No changes below this) --- */}
114
- <DocsSection
115
- title="Explore every component"
116
- description={`${COMPONENT_COUNT} components, fully typed and ready to import.`}
117
- >
118
- <div className="grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-4">
119
- {DOCS_NAV[0].items
120
- .filter((item) => item.slug)
121
- .map((item) => (
122
- <Link
123
- key={item.slug}
124
- href={`/docs/${item.slug}`}
125
- className="group flex items-center gap-3 rounded-xl border border-zinc-200 p-3.5 transition-colors hover:border-zinc-300 hover:bg-zinc-50 dark:border-zinc-800 dark:hover:border-zinc-700 dark:hover:bg-zinc-900/40"
126
- >
127
- <span className="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border border-zinc-200 bg-zinc-50 text-zinc-500 transition-colors group-hover:text-zinc-900 dark:border-zinc-800 dark:bg-zinc-900 dark:text-zinc-400 dark:group-hover:text-white">
128
- <item.icon className="h-4 w-4" />
129
- </span>
130
- <span className="text-sm font-medium text-zinc-700 group-hover:text-zinc-900 dark:text-zinc-300 dark:group-hover:text-white">
131
- {item.title}
132
- </span>
133
- </Link>
134
- ))}
135
- </div>
136
- </DocsSection>
137
-
138
- <DocsSection>
139
- <div className="rounded-3xl border border-zinc-200/70 bg-gradient-to-b from-zinc-50/80 to-white p-8 shadow-[0_2px_8px_rgba(0,0,0,0.04)] dark:border-zinc-800/70 dark:from-zinc-900/30 dark:to-zinc-950 dark:shadow-[0_2px_8px_rgba(0,0,0,0.2)] sm:p-12">
140
- <InstallationSection as="h2" />
141
- </div>
142
- </DocsSection>
143
-
144
- <UsageSection />
145
- <NextSteps />
146
- </DocsPage>
147
- );
148
- }
package/app/favicon.ico DELETED
Binary file
package/app/globals.css DELETED
@@ -1,168 +0,0 @@
1
- @import "tailwindcss";
2
-
3
- @custom-variant dark (&:where(.dark, .dark *));
4
-
5
- :root {
6
- --background: #ffffff;
7
- --foreground: #09090b;
8
- }
9
-
10
- .dark {
11
- --background: #09090b;
12
- --foreground: #fafafa;
13
- }
14
-
15
- @theme inline {
16
- --color-background: var(--background);
17
- --color-foreground: var(--foreground);
18
- --font-sans: var(--font-poppins), ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
19
- --font-mono: var(--font-geist-mono), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
20
- --font-brand: var(--font-orbitron), var(--font-poppins), ui-sans-serif, sans-serif;
21
- }
22
-
23
- html {
24
- overflow-x: clip;
25
- max-width: 100%;
26
- -webkit-text-size-adjust: 100%;
27
- text-size-adjust: 100%;
28
- }
29
-
30
- body {
31
- background: var(--background);
32
- color: var(--foreground);
33
- min-width: 0;
34
- max-width: 100%;
35
- }
36
-
37
- @layer base {
38
- img {
39
- max-width: 100%;
40
- }
41
- }
42
-
43
- @layer utilities {
44
- .docs-scrollbar {
45
- scrollbar-width: thin;
46
- scrollbar-color: rgb(161 161 170 / 0.35) transparent;
47
- }
48
-
49
- .docs-scrollbar::-webkit-scrollbar {
50
- width: 6px;
51
- height: 6px;
52
- }
53
-
54
- .docs-scrollbar::-webkit-scrollbar-track {
55
- background: transparent;
56
- }
57
-
58
- .docs-scrollbar::-webkit-scrollbar-thumb {
59
- background-color: rgb(161 161 170 / 0.35);
60
- border-radius: 9999px;
61
- }
62
-
63
- .docs-scrollbar::-webkit-scrollbar-thumb:hover {
64
- background-color: rgb(161 161 170 / 0.55);
65
- }
66
-
67
- .docs-shell-glow {
68
- background-image:
69
- radial-gradient(circle 620px at 12% -10%, rgb(0 0 0 / 0.05), transparent 60%),
70
- radial-gradient(circle 560px at 100% 0%, rgb(0 0 0 / 0.035), transparent 55%);
71
- }
72
-
73
- .dark .docs-shell-glow {
74
- background-image:
75
- radial-gradient(circle 620px at 12% -10%, rgb(255 255 255 / 0.05), transparent 60%),
76
- radial-gradient(circle 560px at 100% 0%, rgb(255 255 255 / 0.03), transparent 55%);
77
- }
78
-
79
- .hero-spotlight-grid {
80
- background-image:
81
- linear-gradient(to right, rgb(255 255 255 / 0.3) 1px, transparent 1px),
82
- linear-gradient(to bottom, rgb(255 255 255 / 0.3) 1px, transparent 1px);
83
- background-size: 40px 40px;
84
- opacity: 0;
85
- will-change: mask-position, opacity;
86
- -webkit-mask-image: radial-gradient(circle 280px at 280px 280px, black, transparent 72%);
87
- mask-image: radial-gradient(circle 280px at 280px 280px, black, transparent 72%);
88
- -webkit-mask-repeat: no-repeat;
89
- mask-repeat: no-repeat;
90
- -webkit-mask-size: 560px 560px;
91
- mask-size: 560px 560px;
92
- -webkit-mask-position: var(--mask-x, calc(50% - 280px)) var(--mask-y, -280px);
93
- mask-position: var(--mask-x, calc(50% - 280px)) var(--mask-y, -280px);
94
- transition:
95
- opacity 800ms ease,
96
- -webkit-mask-position 900ms cubic-bezier(0.16, 1, 0.3, 1),
97
- mask-position 900ms cubic-bezier(0.16, 1, 0.3, 1);
98
- }
99
-
100
- .hero-spotlight-grid.is-active {
101
- opacity: 1;
102
- }
103
-
104
- /* Fluid type scale — smooth clamp() growth instead of hard breakpoint jumps */
105
- .text-fluid-h1 {
106
- font-size: clamp(2.25rem, 1.7rem + 2vw, 3.75rem);
107
- line-height: 1.1;
108
- }
109
-
110
- .text-fluid-h2 {
111
- font-size: clamp(1.875rem, 1.5rem + 1.4vw, 2.75rem);
112
- line-height: 1.15;
113
- }
114
-
115
- .hero-particle {
116
- position: absolute;
117
- margin: -2px;
118
- border-radius: 9999px;
119
- background: white;
120
- filter: blur(0.3px);
121
- pointer-events: none;
122
- opacity: 0;
123
- animation: hero-particle-drift var(--dur, 2200ms) ease-out forwards;
124
- }
125
- }
126
-
127
- @keyframes hero-particle-drift {
128
- 0% {
129
- transform: translate(0, 0);
130
- opacity: 0;
131
- }
132
- 15% {
133
- opacity: var(--peak-opacity, 0.7);
134
- }
135
- 50% {
136
- transform: translate(var(--dx1, 10px), var(--dy1, 20px));
137
- }
138
- 100% {
139
- transform: translate(var(--dx2, 15px), var(--dy2, 60px));
140
- opacity: 0;
141
- }
142
- }
143
-
144
- @keyframes progress-indeterminate {
145
- 0% {
146
- transform: translateX(-120%);
147
- }
148
- 100% {
149
- transform: translateX(350%);
150
- }
151
- }
152
-
153
- @keyframes pagination-pop {
154
- from {
155
- opacity: 0;
156
- transform: scale(0.85);
157
- }
158
- to {
159
- opacity: 1;
160
- transform: scale(1);
161
- }
162
- }
163
-
164
- ::view-transition-group(*) {
165
- animation-duration: 220ms;
166
- animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
167
- }
168
-
package/app/icon.png DELETED
Binary file
package/app/layout.tsx DELETED
@@ -1,90 +0,0 @@
1
- import type { Metadata, Viewport } from "next";
2
- import { cookies } from "next/headers";
3
- import { Geist_Mono, Orbitron, Poppins } from "next/font/google";
4
- import { ThemeProvider } from "@/components/theme-provider";
5
- import { parseTheme, THEME_COOKIE_KEY } from "@/lib/theme";
6
- import "./globals.css";
7
-
8
- const poppins = Poppins({
9
- variable: "--font-poppins",
10
- subsets: ["latin"],
11
- weight: ["400", "500", "600", "700"],
12
- });
13
-
14
- const geistMono = Geist_Mono({
15
- variable: "--font-geist-mono",
16
- subsets: ["latin"],
17
- });
18
-
19
- const orbitron = Orbitron({
20
- variable: "--font-orbitron",
21
- subsets: ["latin"],
22
- weight: ["600", "700"],
23
- });
24
-
25
- const SITE_URL = "https://ruler-ui.vercel.app";
26
- const SITE_TITLE = "Ruler.ui";
27
- const SITE_DESCRIPTION =
28
- "A sharper way to build interfaces. Precision-crafted React components for modern products.";
29
-
30
- export const viewport: Viewport = {
31
- width: "device-width",
32
- initialScale: 1,
33
- maximumScale: 5,
34
- viewportFit: "cover",
35
- };
36
-
37
- export const metadata: Metadata = {
38
- metadataBase: new URL(SITE_URL),
39
- title: {
40
- default: SITE_TITLE,
41
- template: `%s · ${SITE_TITLE}`,
42
- },
43
- description: SITE_DESCRIPTION,
44
- openGraph: {
45
- title: SITE_TITLE,
46
- description: SITE_DESCRIPTION,
47
- url: SITE_URL,
48
- siteName: SITE_TITLE,
49
- type: "website",
50
- images: [
51
- {
52
- url: "/opengraph-image",
53
- width: 1200,
54
- height: 630,
55
- alt: "Ruler.ui — A sharper way to build interfaces.",
56
- },
57
- ],
58
- },
59
- twitter: {
60
- card: "summary_large_image",
61
- title: SITE_TITLE,
62
- description: SITE_DESCRIPTION,
63
- images: ["/twitter-image"],
64
- },
65
- };
66
-
67
- export default async function RootLayout({
68
- children,
69
- }: Readonly<{
70
- children: React.ReactNode;
71
- }>) {
72
- const cookieStore = await cookies();
73
- const theme = parseTheme(cookieStore.get(THEME_COOKIE_KEY)?.value);
74
- const isDark = theme === "dark";
75
-
76
- return (
77
- <html
78
- lang="en"
79
- className={`${poppins.variable} ${geistMono.variable} ${orbitron.variable} max-w-full antialiased${isDark ? " dark" : ""}`}
80
- suppressHydrationWarning
81
- >
82
- <body
83
- className="min-h-dvh min-w-0 max-w-full bg-white text-zinc-900 dark:bg-zinc-950 dark:text-zinc-50"
84
- suppressHydrationWarning
85
- >
86
- <ThemeProvider defaultTheme={theme}>{children}</ThemeProvider>
87
- </body>
88
- </html>
89
- );
90
- }
@@ -1,10 +0,0 @@
1
- import { createOgImage, ogAlt, ogSize } from "@/lib/og-image";
2
-
3
- export const runtime = "nodejs";
4
- export const alt = ogAlt;
5
- export const size = ogSize;
6
- export const contentType = "image/png";
7
-
8
- export default async function Image() {
9
- return createOgImage();
10
- }
package/app/page.tsx DELETED
@@ -1,34 +0,0 @@
1
- import { HeroCard } from "@/components/landing/hero-card";
2
- import { FeatureHighlights } from "@/components/landing/feature-highlights";
3
- import { InstallationSection } from "@/components/installation-section";
4
- import { QuickStartSection } from "@/components/landing/quick-start-section";
5
- import { FooterStrip } from "@/components/landing/footer-strip";
6
- import { SiteFooter } from "@/components/landing/site-footer";
7
-
8
- export default function Home() {
9
- return (
10
- <main className="min-w-0 overflow-x-clip bg-white dark:bg-zinc-950">
11
- <div className="px-3 pt-3 sm:px-6 sm:pt-4 lg:px-8 xl:px-12">
12
- <HeroCard />
13
- </div>
14
-
15
- <FeatureHighlights />
16
-
17
- <div className="mx-auto max-w-7xl px-6 sm:px-8 lg:px-10 xl:px-12">
18
- <div className="py-10 sm:py-14">
19
- <div className="rounded-3xl border border-zinc-200/70 bg-gradient-to-b from-zinc-50/80 to-white p-5 shadow-[0_2px_8px_rgba(0,0,0,0.04)] dark:border-zinc-800/70 dark:from-zinc-900/30 dark:to-zinc-950 dark:shadow-[0_2px_8px_rgba(0,0,0,0.2)] sm:p-12">
20
- <InstallationSection
21
- caption="ruler.ui is built with TypeScript and works with React 18+."
22
- />
23
- </div>
24
- </div>
25
- <QuickStartSection />
26
- <FooterStrip />
27
- </div>
28
-
29
- <div className="mx-auto max-w-7xl px-6 sm:px-8 lg:px-10 xl:px-12">
30
- <SiteFooter />
31
- </div>
32
- </main>
33
- );
34
- }
@@ -1,10 +0,0 @@
1
- import { createOgImage, ogAlt, ogSize } from "@/lib/og-image";
2
-
3
- export const runtime = "nodejs";
4
- export const alt = ogAlt;
5
- export const size = ogSize;
6
- export const contentType = "image/png";
7
-
8
- export default async function Image() {
9
- return createOgImage();
10
- }