@campminder/ds 0.3.0 → 0.4.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 (34) hide show
  1. package/dist/index.cjs +66 -55
  2. package/dist/index.d.cts +8 -1
  3. package/dist/index.d.ts +8 -1
  4. package/dist/index.js +66 -55
  5. package/fonts/general-sans/GeneralSans-Bold.woff +0 -0
  6. package/fonts/general-sans/GeneralSans-Bold.woff2 +0 -0
  7. package/fonts/general-sans/GeneralSans-BoldItalic.woff +0 -0
  8. package/fonts/general-sans/GeneralSans-BoldItalic.woff2 +0 -0
  9. package/fonts/general-sans/GeneralSans-Extralight.woff +0 -0
  10. package/fonts/general-sans/GeneralSans-Extralight.woff2 +0 -0
  11. package/fonts/general-sans/GeneralSans-ExtralightItalic.woff +0 -0
  12. package/fonts/general-sans/GeneralSans-ExtralightItalic.woff2 +0 -0
  13. package/fonts/general-sans/GeneralSans-Italic.woff +0 -0
  14. package/fonts/general-sans/GeneralSans-Italic.woff2 +0 -0
  15. package/fonts/general-sans/GeneralSans-Light.woff +0 -0
  16. package/fonts/general-sans/GeneralSans-Light.woff2 +0 -0
  17. package/fonts/general-sans/GeneralSans-LightItalic.woff +0 -0
  18. package/fonts/general-sans/GeneralSans-LightItalic.woff2 +0 -0
  19. package/fonts/general-sans/GeneralSans-Medium.woff +0 -0
  20. package/fonts/general-sans/GeneralSans-Medium.woff2 +0 -0
  21. package/fonts/general-sans/GeneralSans-MediumItalic.woff +0 -0
  22. package/fonts/general-sans/GeneralSans-MediumItalic.woff2 +0 -0
  23. package/fonts/general-sans/GeneralSans-Regular.woff +0 -0
  24. package/fonts/general-sans/GeneralSans-Regular.woff2 +0 -0
  25. package/fonts/general-sans/GeneralSans-Semibold.woff +0 -0
  26. package/fonts/general-sans/GeneralSans-Semibold.woff2 +0 -0
  27. package/fonts/general-sans/GeneralSans-SemiboldItalic.woff +0 -0
  28. package/fonts/general-sans/GeneralSans-SemiboldItalic.woff2 +0 -0
  29. package/fonts/general-sans/GeneralSans-Variable.woff +0 -0
  30. package/fonts/general-sans/GeneralSans-Variable.woff2 +0 -0
  31. package/fonts/general-sans/GeneralSans-VariableItalic.woff +0 -0
  32. package/fonts/general-sans/GeneralSans-VariableItalic.woff2 +0 -0
  33. package/package.json +3 -2
  34. package/styles.css +120 -2
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
+ require('../styles.css');
4
5
  var accordion = require('@base-ui/react/accordion');
5
6
  var lucideReact = require('lucide-react');
6
7
  var clsx = require('clsx');
@@ -60,7 +61,7 @@ var RPNInput__default = /*#__PURE__*/_interopDefault(RPNInput);
60
61
  var flags__default = /*#__PURE__*/_interopDefault(flags);
61
62
  var en__default = /*#__PURE__*/_interopDefault(en);
62
63
 
63
- // src/accordion.tsx
64
+ // src/index.ts
64
65
  function cn(...inputs) {
65
66
  return tailwindMerge.twMerge(clsx.clsx(inputs));
66
67
  }
@@ -1432,7 +1433,7 @@ function ColumnCustomizer({
1432
1433
  c.key
1433
1434
  )) })
1434
1435
  ] }),
1435
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col border-l", children: [
1436
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 min-w-0 flex-col overflow-hidden border-l", children: [
1436
1437
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-3 py-2.5", children: [
1437
1438
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm font-semibold", children: [
1438
1439
  draft.length,
@@ -2154,6 +2155,7 @@ function DataTable({
2154
2155
  paginated = false,
2155
2156
  pageSize: pageSizeProp,
2156
2157
  pageSizeOptions = [25, 50, 100],
2158
+ stickyPagination = false,
2157
2159
  page: pageProp,
2158
2160
  onPageChange,
2159
2161
  toolbar,
@@ -2414,59 +2416,68 @@ function DataTable({
2414
2416
  );
2415
2417
  }) })
2416
2418
  ] }) }),
2417
- paginated && total > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-4 px-1 text-sm text-muted-foreground", children: [
2418
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
2419
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Rows per page" }),
2420
- /* @__PURE__ */ jsxRuntime.jsxs(
2421
- Select,
2422
- {
2423
- value: String(pageSize),
2424
- onValueChange: (v) => {
2425
- if (!v) return;
2426
- setPageSizeInner(Number(v));
2427
- setPage(0);
2428
- },
2429
- children: [
2430
- /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { "aria-label": "Rows per page", className: "h-8 w-[70px]", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, {}) }),
2431
- /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: pageSizeOptions.map((n) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: String(n), children: n }, n)) })
2432
- ]
2433
- }
2434
- )
2435
- ] }),
2436
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
2437
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "tabular-nums whitespace-nowrap", children: [
2438
- pageStart + 1,
2439
- "\u2013",
2440
- Math.min(pageStart + pageSize, total),
2441
- " of ",
2442
- total
2443
- ] }),
2444
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
2445
- /* @__PURE__ */ jsxRuntime.jsx(
2446
- "button",
2447
- {
2448
- type: "button",
2449
- onClick: () => setPage(safePage - 1),
2450
- disabled: safePage === 0,
2451
- "aria-label": "Previous page",
2452
- className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2453
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" })
2454
- }
2455
- ),
2456
- /* @__PURE__ */ jsxRuntime.jsx(
2457
- "button",
2458
- {
2459
- type: "button",
2460
- onClick: () => setPage(safePage + 1),
2461
- disabled: safePage >= pageCount - 1,
2462
- "aria-label": "Next page",
2463
- className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2464
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" })
2465
- }
2466
- )
2467
- ] })
2468
- ] })
2469
- ] })
2419
+ paginated && total > 0 && /* @__PURE__ */ jsxRuntime.jsxs(
2420
+ "div",
2421
+ {
2422
+ className: cn(
2423
+ "flex items-center justify-between gap-4 text-sm text-muted-foreground",
2424
+ stickyPagination ? "sticky bottom-0 z-20 rounded-b-xl border-t bg-background px-3 py-2.5 shadow-[0_-2px_6px_-4px_rgba(0,0,0,0.2)]" : "px-1"
2425
+ ),
2426
+ children: [
2427
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
2428
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Rows per page" }),
2429
+ /* @__PURE__ */ jsxRuntime.jsxs(
2430
+ Select,
2431
+ {
2432
+ value: String(pageSize),
2433
+ onValueChange: (v) => {
2434
+ if (!v) return;
2435
+ setPageSizeInner(Number(v));
2436
+ setPage(0);
2437
+ },
2438
+ children: [
2439
+ /* @__PURE__ */ jsxRuntime.jsx(SelectTrigger, { "aria-label": "Rows per page", className: "h-8 w-[70px]", children: /* @__PURE__ */ jsxRuntime.jsx(SelectValue, {}) }),
2440
+ /* @__PURE__ */ jsxRuntime.jsx(SelectContent, { children: pageSizeOptions.map((n) => /* @__PURE__ */ jsxRuntime.jsx(SelectItem, { value: String(n), children: n }, n)) })
2441
+ ]
2442
+ }
2443
+ )
2444
+ ] }),
2445
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
2446
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "tabular-nums whitespace-nowrap", children: [
2447
+ pageStart + 1,
2448
+ "\u2013",
2449
+ Math.min(pageStart + pageSize, total),
2450
+ " of ",
2451
+ total
2452
+ ] }),
2453
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
2454
+ /* @__PURE__ */ jsxRuntime.jsx(
2455
+ "button",
2456
+ {
2457
+ type: "button",
2458
+ onClick: () => setPage(safePage - 1),
2459
+ disabled: safePage === 0,
2460
+ "aria-label": "Previous page",
2461
+ className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2462
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" })
2463
+ }
2464
+ ),
2465
+ /* @__PURE__ */ jsxRuntime.jsx(
2466
+ "button",
2467
+ {
2468
+ type: "button",
2469
+ onClick: () => setPage(safePage + 1),
2470
+ disabled: safePage >= pageCount - 1,
2471
+ "aria-label": "Next page",
2472
+ className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2473
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" })
2474
+ }
2475
+ )
2476
+ ] })
2477
+ ] })
2478
+ ]
2479
+ }
2480
+ )
2470
2481
  ] });
2471
2482
  }
2472
2483
  function DropdownMenu(props) {
package/dist/index.d.cts CHANGED
@@ -301,6 +301,13 @@ interface DataTableProps<T> {
301
301
  paginated?: boolean;
302
302
  pageSize?: number;
303
303
  pageSizeOptions?: number[];
304
+ /**
305
+ * Pin the pagination bar to the bottom of the scroll viewport so it stays
306
+ * reachable without scrolling to the end of a long table. Off by default —
307
+ * only enable when the table is the page's dominant scrolling content (e.g.
308
+ * a full-page list view), not when it sits inside a card among other content.
309
+ */
310
+ stickyPagination?: boolean;
304
311
  page?: number;
305
312
  onPageChange?: (page: number) => void;
306
313
  toolbar?: ReactNode;
@@ -309,7 +316,7 @@ interface DataTableProps<T> {
309
316
  rowClassName?: (row: T) => string;
310
317
  className?: string;
311
318
  }
312
- declare function DataTable<T>({ data, columns, rowKey, selectable, selected: selectedProp, onSelectedChange, bulkActions, sort: sortProp, defaultSort, onSortChange, paginated, pageSize: pageSizeProp, pageSizeOptions, page: pageProp, onPageChange, toolbar, onRowClick, emptyMessage, rowClassName, className, }: DataTableProps<T>): React$1.JSX.Element;
319
+ declare function DataTable<T>({ data, columns, rowKey, selectable, selected: selectedProp, onSelectedChange, bulkActions, sort: sortProp, defaultSort, onSortChange, paginated, pageSize: pageSizeProp, pageSizeOptions, stickyPagination, page: pageProp, onPageChange, toolbar, onRowClick, emptyMessage, rowClassName, className, }: DataTableProps<T>): React$1.JSX.Element;
313
320
 
314
321
  declare function DropdownMenu(props: Menu.Root.Props): React$1.JSX.Element;
315
322
  declare function DropdownMenuTrigger({ ...props }: Menu.Trigger.Props): React$1.JSX.Element;
package/dist/index.d.ts CHANGED
@@ -301,6 +301,13 @@ interface DataTableProps<T> {
301
301
  paginated?: boolean;
302
302
  pageSize?: number;
303
303
  pageSizeOptions?: number[];
304
+ /**
305
+ * Pin the pagination bar to the bottom of the scroll viewport so it stays
306
+ * reachable without scrolling to the end of a long table. Off by default —
307
+ * only enable when the table is the page's dominant scrolling content (e.g.
308
+ * a full-page list view), not when it sits inside a card among other content.
309
+ */
310
+ stickyPagination?: boolean;
304
311
  page?: number;
305
312
  onPageChange?: (page: number) => void;
306
313
  toolbar?: ReactNode;
@@ -309,7 +316,7 @@ interface DataTableProps<T> {
309
316
  rowClassName?: (row: T) => string;
310
317
  className?: string;
311
318
  }
312
- declare function DataTable<T>({ data, columns, rowKey, selectable, selected: selectedProp, onSelectedChange, bulkActions, sort: sortProp, defaultSort, onSortChange, paginated, pageSize: pageSizeProp, pageSizeOptions, page: pageProp, onPageChange, toolbar, onRowClick, emptyMessage, rowClassName, className, }: DataTableProps<T>): React$1.JSX.Element;
319
+ declare function DataTable<T>({ data, columns, rowKey, selectable, selected: selectedProp, onSelectedChange, bulkActions, sort: sortProp, defaultSort, onSortChange, paginated, pageSize: pageSizeProp, pageSizeOptions, stickyPagination, page: pageProp, onPageChange, toolbar, onRowClick, emptyMessage, rowClassName, className, }: DataTableProps<T>): React$1.JSX.Element;
313
320
 
314
321
  declare function DropdownMenu(props: Menu.Root.Props): React$1.JSX.Element;
315
322
  declare function DropdownMenuTrigger({ ...props }: Menu.Trigger.Props): React$1.JSX.Element;
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import '../styles.css';
2
3
  import { Accordion as Accordion$1 } from '@base-ui/react/accordion';
3
4
  import { ChevronDown, CheckIcon, ChevronRightIcon, MoreHorizontalIcon, Loader2, ChevronDownIcon, ChevronUpIcon, XIcon, PlusIcon, Columns3, Search, GripVertical, X, SearchIcon, ChevronLeft, ChevronRight, Check, Circle, ListFilter, PencilIcon, TrashIcon, ArrowLeftIcon, ArrowRightIcon, ChevronLeftIcon, ChevronsUpDown, CameraIcon, PanelLeftIcon, Loader2Icon, OctagonXIcon, TriangleAlertIcon, InfoIcon, CircleCheckIcon, BadgeCheck, ChevronUp, AlertTriangleIcon } from 'lucide-react';
4
5
  import { clsx } from 'clsx';
@@ -35,7 +36,7 @@ import { Toaster as Toaster$1 } from 'sonner';
35
36
  import { Switch as Switch$1 } from '@base-ui/react/switch';
36
37
  import { Tabs as Tabs$1 } from '@base-ui/react/tabs';
37
38
 
38
- // src/accordion.tsx
39
+ // src/index.ts
39
40
  function cn(...inputs) {
40
41
  return twMerge(clsx(inputs));
41
42
  }
@@ -1407,7 +1408,7 @@ function ColumnCustomizer({
1407
1408
  c.key
1408
1409
  )) })
1409
1410
  ] }),
1410
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col border-l", children: [
1411
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 min-w-0 flex-col overflow-hidden border-l", children: [
1411
1412
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-3 py-2.5", children: [
1412
1413
  /* @__PURE__ */ jsxs("span", { className: "text-sm font-semibold", children: [
1413
1414
  draft.length,
@@ -2129,6 +2130,7 @@ function DataTable({
2129
2130
  paginated = false,
2130
2131
  pageSize: pageSizeProp,
2131
2132
  pageSizeOptions = [25, 50, 100],
2133
+ stickyPagination = false,
2132
2134
  page: pageProp,
2133
2135
  onPageChange,
2134
2136
  toolbar,
@@ -2389,59 +2391,68 @@ function DataTable({
2389
2391
  );
2390
2392
  }) })
2391
2393
  ] }) }),
2392
- paginated && total > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4 px-1 text-sm text-muted-foreground", children: [
2393
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
2394
- /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "Rows per page" }),
2395
- /* @__PURE__ */ jsxs(
2396
- Select,
2397
- {
2398
- value: String(pageSize),
2399
- onValueChange: (v) => {
2400
- if (!v) return;
2401
- setPageSizeInner(Number(v));
2402
- setPage(0);
2403
- },
2404
- children: [
2405
- /* @__PURE__ */ jsx(SelectTrigger, { "aria-label": "Rows per page", className: "h-8 w-[70px]", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
2406
- /* @__PURE__ */ jsx(SelectContent, { children: pageSizeOptions.map((n) => /* @__PURE__ */ jsx(SelectItem, { value: String(n), children: n }, n)) })
2407
- ]
2408
- }
2409
- )
2410
- ] }),
2411
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
2412
- /* @__PURE__ */ jsxs("span", { className: "tabular-nums whitespace-nowrap", children: [
2413
- pageStart + 1,
2414
- "\u2013",
2415
- Math.min(pageStart + pageSize, total),
2416
- " of ",
2417
- total
2418
- ] }),
2419
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
2420
- /* @__PURE__ */ jsx(
2421
- "button",
2422
- {
2423
- type: "button",
2424
- onClick: () => setPage(safePage - 1),
2425
- disabled: safePage === 0,
2426
- "aria-label": "Previous page",
2427
- className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2428
- children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" })
2429
- }
2430
- ),
2431
- /* @__PURE__ */ jsx(
2432
- "button",
2433
- {
2434
- type: "button",
2435
- onClick: () => setPage(safePage + 1),
2436
- disabled: safePage >= pageCount - 1,
2437
- "aria-label": "Next page",
2438
- className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2439
- children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
2440
- }
2441
- )
2442
- ] })
2443
- ] })
2444
- ] })
2394
+ paginated && total > 0 && /* @__PURE__ */ jsxs(
2395
+ "div",
2396
+ {
2397
+ className: cn(
2398
+ "flex items-center justify-between gap-4 text-sm text-muted-foreground",
2399
+ stickyPagination ? "sticky bottom-0 z-20 rounded-b-xl border-t bg-background px-3 py-2.5 shadow-[0_-2px_6px_-4px_rgba(0,0,0,0.2)]" : "px-1"
2400
+ ),
2401
+ children: [
2402
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
2403
+ /* @__PURE__ */ jsx("span", { className: "hidden sm:inline", children: "Rows per page" }),
2404
+ /* @__PURE__ */ jsxs(
2405
+ Select,
2406
+ {
2407
+ value: String(pageSize),
2408
+ onValueChange: (v) => {
2409
+ if (!v) return;
2410
+ setPageSizeInner(Number(v));
2411
+ setPage(0);
2412
+ },
2413
+ children: [
2414
+ /* @__PURE__ */ jsx(SelectTrigger, { "aria-label": "Rows per page", className: "h-8 w-[70px]", children: /* @__PURE__ */ jsx(SelectValue, {}) }),
2415
+ /* @__PURE__ */ jsx(SelectContent, { children: pageSizeOptions.map((n) => /* @__PURE__ */ jsx(SelectItem, { value: String(n), children: n }, n)) })
2416
+ ]
2417
+ }
2418
+ )
2419
+ ] }),
2420
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
2421
+ /* @__PURE__ */ jsxs("span", { className: "tabular-nums whitespace-nowrap", children: [
2422
+ pageStart + 1,
2423
+ "\u2013",
2424
+ Math.min(pageStart + pageSize, total),
2425
+ " of ",
2426
+ total
2427
+ ] }),
2428
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
2429
+ /* @__PURE__ */ jsx(
2430
+ "button",
2431
+ {
2432
+ type: "button",
2433
+ onClick: () => setPage(safePage - 1),
2434
+ disabled: safePage === 0,
2435
+ "aria-label": "Previous page",
2436
+ className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2437
+ children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-4" })
2438
+ }
2439
+ ),
2440
+ /* @__PURE__ */ jsx(
2441
+ "button",
2442
+ {
2443
+ type: "button",
2444
+ onClick: () => setPage(safePage + 1),
2445
+ disabled: safePage >= pageCount - 1,
2446
+ "aria-label": "Next page",
2447
+ className: "inline-flex size-8 items-center justify-center rounded-md border bg-background hover:bg-muted disabled:pointer-events-none disabled:opacity-40",
2448
+ children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-4" })
2449
+ }
2450
+ )
2451
+ ] })
2452
+ ] })
2453
+ ]
2454
+ }
2455
+ )
2445
2456
  ] });
2446
2457
  }
2447
2458
  function DropdownMenu(props) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@campminder/ds",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "private": false,
5
5
  "description": "Campminder design system components, packaged. base-ui-era shadcn primitives + domain components + design tokens, for apps that prefer npm install over shadcn copy-source.",
6
6
  "repository": {
@@ -14,7 +14,8 @@
14
14
  ],
15
15
  "files": [
16
16
  "dist",
17
- "styles.css"
17
+ "styles.css",
18
+ "fonts"
18
19
  ],
19
20
  "main": "./dist/index.cjs",
20
21
  "module": "./dist/index.js",
package/styles.css CHANGED
@@ -2,9 +2,122 @@
2
2
  Run `npm run build` (or `node scripts/gen-tokens-css.mjs`) to regenerate.
3
3
  Consumers: @import "@campminder/ds/styles.css" after @import "tailwindcss". */
4
4
 
5
+ @font-face {
6
+ font-family: 'General Sans';
7
+ src: url('./fonts/general-sans/GeneralSans-Extralight.woff2') format('woff2'),
8
+ url('./fonts/general-sans/GeneralSans-Extralight.woff') format('woff');
9
+ font-weight: 200;
10
+ font-style: normal;
11
+ font-display: swap;
12
+ }
13
+ @font-face {
14
+ font-family: 'General Sans';
15
+ src: url('./fonts/general-sans/GeneralSans-Light.woff2') format('woff2'),
16
+ url('./fonts/general-sans/GeneralSans-Light.woff') format('woff');
17
+ font-weight: 300;
18
+ font-style: normal;
19
+ font-display: swap;
20
+ }
21
+ @font-face {
22
+ font-family: 'General Sans';
23
+ src: url('./fonts/general-sans/GeneralSans-Regular.woff2') format('woff2'),
24
+ url('./fonts/general-sans/GeneralSans-Regular.woff') format('woff');
25
+ font-weight: 400;
26
+ font-style: normal;
27
+ font-display: swap;
28
+ }
29
+ @font-face {
30
+ font-family: 'General Sans';
31
+ src: url('./fonts/general-sans/GeneralSans-Medium.woff2') format('woff2'),
32
+ url('./fonts/general-sans/GeneralSans-Medium.woff') format('woff');
33
+ font-weight: 500;
34
+ font-style: normal;
35
+ font-display: swap;
36
+ }
37
+ @font-face {
38
+ font-family: 'General Sans';
39
+ src: url('./fonts/general-sans/GeneralSans-Semibold.woff2') format('woff2'),
40
+ url('./fonts/general-sans/GeneralSans-Semibold.woff') format('woff');
41
+ font-weight: 600;
42
+ font-style: normal;
43
+ font-display: swap;
44
+ }
45
+ @font-face {
46
+ font-family: 'General Sans';
47
+ src: url('./fonts/general-sans/GeneralSans-Bold.woff2') format('woff2'),
48
+ url('./fonts/general-sans/GeneralSans-Bold.woff') format('woff');
49
+ font-weight: 700;
50
+ font-style: normal;
51
+ font-display: swap;
52
+ }
53
+ @font-face {
54
+ font-family: 'General Sans';
55
+ src: url('./fonts/general-sans/GeneralSans-ExtralightItalic.woff2') format('woff2'),
56
+ url('./fonts/general-sans/GeneralSans-ExtralightItalic.woff') format('woff');
57
+ font-weight: 200;
58
+ font-style: italic;
59
+ font-display: swap;
60
+ }
61
+ @font-face {
62
+ font-family: 'General Sans';
63
+ src: url('./fonts/general-sans/GeneralSans-LightItalic.woff2') format('woff2'),
64
+ url('./fonts/general-sans/GeneralSans-LightItalic.woff') format('woff');
65
+ font-weight: 300;
66
+ font-style: italic;
67
+ font-display: swap;
68
+ }
69
+ @font-face {
70
+ font-family: 'General Sans';
71
+ src: url('./fonts/general-sans/GeneralSans-Italic.woff2') format('woff2'),
72
+ url('./fonts/general-sans/GeneralSans-Italic.woff') format('woff');
73
+ font-weight: 400;
74
+ font-style: italic;
75
+ font-display: swap;
76
+ }
77
+ @font-face {
78
+ font-family: 'General Sans';
79
+ src: url('./fonts/general-sans/GeneralSans-MediumItalic.woff2') format('woff2'),
80
+ url('./fonts/general-sans/GeneralSans-MediumItalic.woff') format('woff');
81
+ font-weight: 500;
82
+ font-style: italic;
83
+ font-display: swap;
84
+ }
85
+ @font-face {
86
+ font-family: 'General Sans';
87
+ src: url('./fonts/general-sans/GeneralSans-SemiboldItalic.woff2') format('woff2'),
88
+ url('./fonts/general-sans/GeneralSans-SemiboldItalic.woff') format('woff');
89
+ font-weight: 600;
90
+ font-style: italic;
91
+ font-display: swap;
92
+ }
93
+ @font-face {
94
+ font-family: 'General Sans';
95
+ src: url('./fonts/general-sans/GeneralSans-BoldItalic.woff2') format('woff2'),
96
+ url('./fonts/general-sans/GeneralSans-BoldItalic.woff') format('woff');
97
+ font-weight: 700;
98
+ font-style: italic;
99
+ font-display: swap;
100
+ }
101
+ @font-face {
102
+ font-family: 'General Sans Variable';
103
+ src: url('./fonts/general-sans/GeneralSans-Variable.woff2') format('woff2'),
104
+ url('./fonts/general-sans/GeneralSans-Variable.woff') format('woff');
105
+ font-weight: 200 700;
106
+ font-style: normal;
107
+ font-display: swap;
108
+ }
109
+ @font-face {
110
+ font-family: 'General Sans Variable';
111
+ src: url('./fonts/general-sans/GeneralSans-VariableItalic.woff2') format('woff2'),
112
+ url('./fonts/general-sans/GeneralSans-VariableItalic.woff') format('woff');
113
+ font-weight: 200 700;
114
+ font-style: italic;
115
+ font-display: swap;
116
+ }
117
+
5
118
  @theme {
6
- /* Inter is loaded via next/font as --font-inter; fall back to webfont/system Inter */
7
- --font-sans: var(--font-inter), "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
119
+ /* General Sans is self-hosted via @font-face above */
120
+ --font-sans: "General Sans", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
8
121
  --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
9
122
 
10
123
  --color-background: var(--base-background, #ffffff);
@@ -228,5 +341,10 @@
228
341
  color-scheme: light;
229
342
  }
230
343
 
344
+ /* Apply General Sans as the base typeface. */
345
+ body {
346
+ font-family: var(--font-sans);
347
+ }
348
+
231
349
  /* Scan the package's compiled components so Tailwind v4 keeps their classes. */
232
350
  @source "./dist";