Skip to content

feat: add a portal plugin template, guidance and documentation #525

Merged
pcfreak30 merged 4 commits intodevelopfrom
lib/plugin-template
Oct 18, 2025
Merged

feat: add a portal plugin template, guidance and documentation #525
pcfreak30 merged 4 commits intodevelopfrom
lib/plugin-template

Conversation

@pcfreak30
Copy link
Copy Markdown
Member

@pcfreak30 pcfreak30 commented Oct 18, 2025

Summary by CodeRabbit

  • New Features

    • Added a full plugin template including a sample plugin, dashboard and settings pages, route entries, UI hook, and placeholder widget registrations for quick starting plugins.
  • Documentation

    • Added Plugin Guidelines, expanded main README with architecture and workflows, and a plugin-template README with quick start, structure, build, and troubleshooting.
  • Packaging & Tooling

    • Added package, build, bundling, and config scaffolding to support local development and publishing.

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Oct 18, 2025

⚠️ No Changeset found

Latest commit: 231fc13

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Oct 18, 2025

Walkthrough

Adds comprehensive plugin guidelines and a complete portal-plugin template: docs, package config, build tooling, TypeScript APIs, utilities, a refine-config capability, a feature class, routes, UI pages, hooks, widget registration scaffolding, and Vite/tsdown/Tailwind/PostCSS configs.

Changes

Cohort / File(s) Summary
Documentation
PLUGIN_GUIDELINES.md, README.md, libs/portal-plugin-template/README.md
New detailed plugin guidelines, expanded project README with architecture and workflows, and a template-specific README with quick start and troubleshooting.
Project & Build Config
libs/portal-plugin-template/package.json, libs/portal-plugin-template/vite.config.ts, libs/portal-plugin-template/tsdown.config.ts, libs/portal-plugin-template/tsconfig.json, libs/portal-plugin-template/tailwind.config.ts, libs/portal-plugin-template/postcss.config.cjs
New package metadata, Vite plugin config using sharedModules and devPort 4177, tsdown publishing config, TypeScript path aliases, Tailwind and PostCSS configs.
Plugin Manifest
libs/portal-plugin-template/plugin.config.ts
New PluginConfig export declaring plugin name, directory, and Module Federation exposes (index, dashboard, settings).
Plugin Entry & Registration
libs/portal-plugin-template/src/index.ts, libs/portal-plugin-template/src/widgetRegistrations.ts, libs/portal-plugin-template/src/routes.tsx, libs/portal-plugin-template/src/types.ts
New plugin entry returning a Plugin object (capabilities, features, id, routes, widgets), placeholder widget registrations, route definitions, and re-exported plugin types.
Capabilities & Features
libs/portal-plugin-template/src/capabilities/refineConfig.ts, libs/portal-plugin-template/src/features/template/Feature.ts, libs/portal-plugin-template/src/features/template/index.ts
Added a RefineConfig capability class (id/type, initialize/getConfig/destroy) and a namespaced Feature class with lifecycle methods and a config accessor.
Library Surface (src-lib)
libs/portal-plugin-template/src-lib/index.ts, libs/portal-plugin-template/src-lib/types/index.ts, libs/portal-plugin-template/src-lib/types/template.ts, libs/portal-plugin-template/src-lib/util/index.ts, libs/portal-plugin-template/src-lib/util/templateHelpers.ts
New lib export barrel, template types (TemplateConfig/State/Capability/Feature), and utility helpers for config validation, defaults, formatting, error messages, and state helpers.
UI Components & Hooks
libs/portal-plugin-template/src/ui/components/index.ts, libs/portal-plugin-template/src/ui/hooks/useTemplate.ts, libs/portal-plugin-template/src/ui/util/templateHelpers.ts, libs/portal-plugin-template/src/ui/routes/dashboard.tsx, libs/portal-plugin-template/src/ui/routes/settings.tsx
Added UI placeholder exports, a useTemplate hook (state, config, initialize), UI helper re-exports, and Dashboard/Settings route components using framework UI primitives.

Sequence Diagram(s)

sequenceDiagram
  participant Framework
  participant PluginModule
  participant Capability as RefineConfigCapability
  participant Feature
  participant Router
  Note over Framework,PluginModule: Plugin load & registration (dev/runtime)
  Framework->>PluginModule: import plugin entry (exposed module)
  PluginModule->>Framework: return Plugin { id, capabilities, features, routes, widgets }
  Framework->>Capability: initialize(framework)
  Framework->>Feature: initialize(framework)
  Framework->>Router: register routes (from Plugin.routes)
  Note right of Framework: On framework config merge
  Framework->>Capability: getConfig(existingConfig)
  Capability-->>Framework: mergedRefineConfig
  Note over Framework,Router: UI routing uses registered routes -> Dashboard/Settings components loaded as needed
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Poem

🐰 I hopped a path through config trees,

with routes and hooks and tiny keys.
A template stitched for devs to start,
with types and tools and module parts.
Hop on — plugins bloom from this small heart. ✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The PR title "feat: add a portal plugin template, guidance and documentation" directly and comprehensively summarizes the main changes in the changeset. The PR introduces three key components: a complete portal plugin template (libs/portal-plugin-template/ with full source code structure), guidance documentation (PLUGIN_GUIDELINES.md with development best practices), and expanded documentation (README.md files at root and template level). The title is specific, clear, and concise without unnecessary noise, making it easy for teammates scanning history to understand that this PR adds a full plugin template with supporting documentation and guidelines.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch lib/plugin-template

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9ebf8c1 and 231fc13.

📒 Files selected for processing (6)
  • libs/portal-plugin-template/postcss.config.cjs (1 hunks)
  • libs/portal-plugin-template/src-lib/util/templateHelpers.ts (1 hunks)
  • libs/portal-plugin-template/src/routes.tsx (1 hunks)
  • libs/portal-plugin-template/src/types.ts (1 hunks)
  • libs/portal-plugin-template/src/ui/util/templateHelpers.ts (1 hunks)
  • libs/portal-plugin-template/tsdown.config.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • libs/portal-plugin-template/src/routes.tsx
  • libs/portal-plugin-template/tsdown.config.ts
  • libs/portal-plugin-template/src/ui/util/templateHelpers.ts
  • libs/portal-plugin-template/src-lib/util/templateHelpers.ts
🔇 Additional comments (2)
libs/portal-plugin-template/postcss.config.cjs (1)

1-6: LGTM! Previous syntax error has been correctly addressed.

The configuration now properly uses CommonJS module.exports syntax, which is correct for the .cjs file extension. The PostCSS plugin configuration is valid, with Tailwind CSS and Autoprefixer in the correct order, and the empty configuration objects are appropriate as the plugins will use their defaults or pick up settings from other config files (like tailwind.config.ts).

libs/portal-plugin-template/src/types.ts (1)

1-4: Path alias configuration verified; re-export pattern is correct.

The @lib path alias is properly configured in tsconfig.json and correctly maps to ./src-lib/. Both TemplateConfig and TemplateState types exist in the target file with complete documentation. The re-export approach successfully maintains a single source of truth and eliminates duplication.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

🧹 Nitpick comments (12)
libs/portal-plugin-template/src/ui/hooks/useTemplate.ts (1)

28-30: Consider wrapping initialize in useCallback to satisfy React hooks dependencies.

The useEffect calls initialize but doesn't include it in the dependency array. While this works for the template's simple use case, it violates React's exhaustive-deps rule and could cause issues if the hook is extended.

Apply this diff to fix the issue:

+import { useState, useEffect, useCallback } from "react";
-import { useState, useEffect } from "react";
 import type { TemplateState, TemplateConfig } from "@/types";
 
 export function useTemplate() {
   const [state, setState] = useState<TemplateState>({
     isLoading: false,
   });
 
   const [config, setConfig] = useState<TemplateConfig>({
     enabled: true,
   });
 
   // Add your hook logic here
-  const initialize = async () => {
+  const initialize = useCallback(async () => {
     setState(prev => ({ ...prev, isLoading: true }));
     try {
       // Initialize plugin logic
       setState(prev => ({ ...prev, isLoading: false }));
     } catch (error) {
       setState(prev => ({
         ...prev,
         isLoading: false,
         error: error instanceof Error ? error.message : "Unknown error",
       }));
     }
-  };
+  }, []);
 
   useEffect(() => {
     initialize();
-  }, []);
+  }, [initialize]);

Alternatively, if you prefer to keep the template simpler, add an ESLint disable comment:

   useEffect(() => {
     initialize();
+    // eslint-disable-next-line react-hooks/exhaustive-deps
   }, []);
libs/portal-plugin-template/README.md (1)

1-455: Excellent comprehensive documentation! Consider minor markdown polish.

This README provides thorough guidance for plugin developers, covering all essential topics from quick start to troubleshooting. The structure is logical and the examples are clear and practical.

For enhanced markdown compliance, consider these minor improvements:

  1. Line 70: Specify language for the code fence:
-```
+```plaintext
 lume-web/
  1. Line 258: Format the bare URL:
-- **URL**: http://localhost:6006
+- **URL**: <http://localhost:6006>

These are purely cosmetic improvements and don't affect the documentation's value or usability.

README.md (1)

1-438: Excellent documentation expansion! The architecture overview significantly improves discoverability.

The expanded README transforms this from a basic project overview into a comprehensive guide covering architecture patterns, plugin system details, development workflows, and best practices. This will greatly help new developers understand the monorepo structure and the Module Federation architecture.

For markdown compliance, consider these minor improvements:

  1. Line 70: Add language specifier to the code fence:
-```
+```plaintext
 lume-web/
  1. Line 258: Format the bare URL:
-- **URL**: http://localhost:6006
+- **URL**: <http://localhost:6006>

These are cosmetic improvements that don't impact the documentation's effectiveness.

libs/portal-plugin-template/src/index.ts (2)

15-17: Replace console.log with framework logging.

Since this is a template, consider demonstrating proper logging practices by using the framework's logging mechanism instead of console.log, or add a comment indicating that users should replace this with their logging solution.

Example:

  async destroy(_framework: Framework) {
-   console.log("Plugin Template destroyed");
+   // TODO: Replace with your logging solution
+   // framework.logger?.info("Plugin Template destroyed");
  },

20-22: Replace console.log with framework logging.

Same issue as the destroy method - consider demonstrating proper logging practices.

libs/portal-plugin-template/src/ui/routes/dashboard.tsx (1)

52-54: Avoid hardcoding the plugin ID.

The plugin ID "core:template" is hardcoded here but also defined in src/index.ts using createNamespacedId("core", "template"). When developers copy this template and change the plugin ID, they may forget to update this display value, leading to inconsistency.

Consider one of these approaches:

  1. Import the plugin ID from a shared constant
  2. Access it from framework context if available
  3. Add a clear TODO comment indicating this should be updated

Example approach with shared constant:

// In src/constants.ts
export const PLUGIN_NAMESPACE = "core";
export const PLUGIN_NAME = "template";

// In src/index.ts
import { PLUGIN_NAMESPACE, PLUGIN_NAME } from "./constants";
// ...
id: createNamespacedId(PLUGIN_NAMESPACE, PLUGIN_NAME),

// In src/ui/routes/dashboard.tsx
import { PLUGIN_NAMESPACE, PLUGIN_NAME } from "../../constants";
// ...
Plugin ID: {PLUGIN_NAMESPACE}:{PLUGIN_NAME}
libs/portal-plugin-template/src/features/template/Feature.ts (1)

10-18: Consider using framework logging instead of console.log.

The console.log statements are acceptable for a template, but production plugins should use the framework's logging facilities if available for better observability and log level control.

If the framework provides a logger, consider:

async initialize(framework: Framework): Promise<void> {
  // Initialize the template feature
  framework.logger?.info("Template feature initialized");
}

async destroy(framework: Framework): Promise<void> {
  // Cleanup the template feature
  framework.logger?.info("Template feature destroyed");
}
PLUGIN_GUIDELINES.md (2)

30-60: Add language identifier to fenced code block.

The directory structure code block should specify a language for proper syntax highlighting and markdown compliance.

Apply this diff:

-```
+```text
 libs/portal-plugin-{name}/
 ├── package.json                    # Plugin metadata and dependencies

As per static analysis.


298-314: Add language identifier to fenced code block.

The UI components structure code block should specify a language for proper syntax highlighting and markdown compliance.

Apply this diff:

-```
+```text
 src/ui/
 ├── components/          # Reusable components

As per static analysis.

libs/portal-plugin-template/src/ui/util/templateHelpers.ts (1)

8-18: Consider consolidating utilities and adding string error handling.

Two observations:

  1. These utilities duplicate src-lib/util/templateHelpers.ts with less robust implementations. Consider re-exporting from src-lib for consistency.

  2. getTemplateErrorMessage doesn't handle string errors (line 17 only handles Error instances). The src-lib version includes:

    if (typeof error === "string") {
      return error;
    }

If consolidation isn't desired, apply this diff to add string handling:

 export function getTemplateErrorMessage(error: unknown): string {
   if (error instanceof Error) {
     return error.message;
   }
+  if (typeof error === "string") {
+    return error;
+  }
   return "An unknown error occurred";
 }
libs/portal-plugin-template/src-lib/util/templateHelpers.ts (2)

42-56: Duplicate function with different implementations.

The formatTemplateData function is implemented in both this file and src/ui/util/templateHelpers.ts:

  • This version (lines 42-56): robust implementation with null checks, type checks, and error handling
  • UI version: simple JSON.stringify(data, null, 2)

This implementation is more comprehensive and should likely be the canonical version.

Consolidate to a single implementation:

  1. If this version is the preferred implementation, remove or update the UI version to import from here
  2. Add a comment in the UI file redirecting to this implementation
  3. Ensure all consumers use the same version to maintain consistent behavior

61-71: Duplicate function across util modules.

The getTemplateErrorMessage function has identical implementations in both src-lib/util/templateHelpers.ts and src/ui/util/templateHelpers.ts.

Since the implementations are identical, extract this to a single shared location and import it where needed. This reduces maintenance burden and ensures consistency.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9515ed1 and 9ebf8c1.

📒 Files selected for processing (27)
  • PLUGIN_GUIDELINES.md (1 hunks)
  • README.md (1 hunks)
  • libs/portal-plugin-template/README.md (1 hunks)
  • libs/portal-plugin-template/package.json (1 hunks)
  • libs/portal-plugin-template/plugin.config.ts (1 hunks)
  • libs/portal-plugin-template/postcss.config.cjs (1 hunks)
  • libs/portal-plugin-template/src-lib/index.ts (1 hunks)
  • libs/portal-plugin-template/src-lib/types/index.ts (1 hunks)
  • libs/portal-plugin-template/src-lib/types/template.ts (1 hunks)
  • libs/portal-plugin-template/src-lib/util/index.ts (1 hunks)
  • libs/portal-plugin-template/src-lib/util/templateHelpers.ts (1 hunks)
  • libs/portal-plugin-template/src/capabilities/refineConfig.ts (1 hunks)
  • libs/portal-plugin-template/src/features/template/Feature.ts (1 hunks)
  • libs/portal-plugin-template/src/features/template/index.ts (1 hunks)
  • libs/portal-plugin-template/src/index.ts (1 hunks)
  • libs/portal-plugin-template/src/routes.tsx (1 hunks)
  • libs/portal-plugin-template/src/types.ts (1 hunks)
  • libs/portal-plugin-template/src/ui/components/index.ts (1 hunks)
  • libs/portal-plugin-template/src/ui/hooks/useTemplate.ts (1 hunks)
  • libs/portal-plugin-template/src/ui/routes/dashboard.tsx (1 hunks)
  • libs/portal-plugin-template/src/ui/routes/settings.tsx (1 hunks)
  • libs/portal-plugin-template/src/ui/util/templateHelpers.ts (1 hunks)
  • libs/portal-plugin-template/src/widgetRegistrations.ts (1 hunks)
  • libs/portal-plugin-template/tailwind.config.ts (1 hunks)
  • libs/portal-plugin-template/tsconfig.json (1 hunks)
  • libs/portal-plugin-template/tsdown.config.ts (1 hunks)
  • libs/portal-plugin-template/vite.config.ts (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (8)
libs/portal-plugin-template/src/ui/hooks/useTemplate.ts (2)
libs/portal-plugin-template/src-lib/types/template.ts (2)
  • TemplateState (29-44)
  • TemplateConfig (4-24)
libs/portal-plugin-template/src/types.ts (2)
  • TemplateState (11-15)
  • TemplateConfig (3-9)
libs/portal-plugin-template/src/routes.tsx (1)
libs/portal-plugin-template/src/ui/routes/settings.tsx (1)
  • Settings (3-39)
libs/portal-plugin-template/src/ui/util/templateHelpers.ts (1)
libs/portal-plugin-template/src-lib/util/templateHelpers.ts (3)
  • formatTemplateData (42-56)
  • validateTemplateConfig (6-24)
  • getTemplateErrorMessage (61-71)
libs/portal-plugin-template/src/types.ts (1)
libs/portal-plugin-template/src-lib/types/template.ts (2)
  • TemplateConfig (4-24)
  • TemplateState (29-44)
libs/portal-plugin-template/src/capabilities/refineConfig.ts (1)
libs/portal-framework-core/src/util/refineConfig.ts (1)
  • mergeRefineConfig (32-59)
libs/portal-plugin-template/src-lib/types/template.ts (1)
libs/portal-plugin-template/src/types.ts (2)
  • TemplateConfig (3-9)
  • TemplateState (11-15)
libs/portal-plugin-template/src-lib/util/templateHelpers.ts (2)
libs/portal-plugin-template/src/ui/util/templateHelpers.ts (3)
  • validateTemplateConfig (8-11)
  • formatTemplateData (3-6)
  • getTemplateErrorMessage (13-18)
libs/portal-plugin-template/src-lib/types/template.ts (2)
  • TemplateConfig (4-24)
  • TemplateState (29-44)
libs/portal-plugin-template/src/index.ts (1)
libs/portal-plugin-template/src-lib/types/template.ts (1)
  • TemplateFeature (74-99)
🪛 Biome (2.1.2)
libs/portal-plugin-template/postcss.config.cjs

[error] 1-6: Illegal use of an export declaration outside of a module

not allowed inside scripts

(parse)

🪛 LanguageTool
libs/portal-plugin-template/README.md

[grammar] ~354-~354: Use a hyphen to join words.
Context: ...s gracefully - Use the framework's error handling patterns ## Integration with A...

(QB_NEW_EN_HYPHEN)


[grammar] ~430-~430: Ensure spelling is correct
Context: ...s. Use unique route paths. ### Missing Exposes All route components must be properly ex...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

README.md

[uncategorized] ~359-~359: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...loading**: Load components and features on demand 2. Code splitting: Split large feat...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🪛 markdownlint-cli2 (0.18.1)
libs/portal-plugin-template/README.md

70-70: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


258-258: Bare URL used

(MD034, no-bare-urls)

PLUGIN_GUIDELINES.md

30-30: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


298-298: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

README.md

70-70: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


258-258: Bare URL used

(MD034, no-bare-urls)

🔇 Additional comments (18)
libs/portal-plugin-template/tailwind.config.ts (1)

1-9: LGTM! Clean Tailwind configuration for the plugin template.

The configuration is minimal and appropriate for a template, with correct content paths that will process all relevant source files. The type-safe satisfies Config assertion ensures configuration validity.

libs/portal-plugin-template/src/ui/components/index.ts (1)

1-3: LGTM! Appropriate placeholder for component exports.

This placeholder file provides clear guidance for template users on how to export reusable components, which aligns with the template's educational purpose.

libs/portal-plugin-template/src/ui/routes/settings.tsx (1)

1-39: LGTM! Well-structured settings page template.

The component follows the framework's UI patterns, uses appropriate Card components, and provides clear placeholder guidance for plugin developers. The structure mirrors the dashboard route component, maintaining consistency across the template.

libs/portal-plugin-template/src-lib/types/index.ts (1)

1-2: LGTM! Clean barrel export for library types.

This follows the standard pattern for aggregating and re-exporting types, providing a clean public API surface for the plugin template's library interface.

libs/portal-plugin-template/src-lib/index.ts (1)

1-2: LGTM!

Clean barrel export pattern for the public library API surface.

libs/portal-plugin-template/tsconfig.json (1)

1-11: LGTM!

Path aliases are properly configured and align with the plugin template structure.

libs/portal-plugin-template/src/features/template/index.ts (1)

1-1: LGTM!

Standard barrel export pattern for the feature module.

libs/portal-plugin-template/src-lib/util/index.ts (1)

1-2: LGTM!

Clear barrel export with helpful comment documenting the module's purpose.

libs/portal-plugin-template/src/index.ts (1)

12-26: LGTM!

The plugin structure is well-organized with all required Plugin properties properly defined. The use of satisfies Plugin provides helpful type checking.

libs/portal-plugin-template/package.json (2)

6-7: Verify "main" and "types" paths align with build output.

The main field points to lib-dist/index.js while the exports field uses lib-dist/esm/index.js. Ensure this is intentional for legacy fallback and that your build process (tsdown) generates files at both locations.


1-39: LGTM!

Package configuration properly supports dual ESM/CJS exports and includes all necessary dependencies for the plugin template.

libs/portal-plugin-template/src/routes.tsx (2)

17-17: Verify component reference matches plugin.config.ts exposes.

Same concern as the dashboard route - ensure "settings" matches an exposed module name in plugin.config.ts.


4-25: LGTM!

Route definitions are well-structured with appropriate navigation metadata and use type-safe satisfies assertion.

libs/portal-plugin-template/src/ui/routes/dashboard.tsx (1)

3-60: LGTM!

The dashboard component provides a clear, well-structured template starting point with helpful placeholder content and proper use of the framework's UI components.

libs/portal-plugin-template/src/widgetRegistrations.ts (1)

1-15: LGTM! Clean widget registration template.

The placeholder array with commented example provides clear guidance for developers to add widget registrations.

libs/portal-plugin-template/vite.config.ts (1)

1-14: LGTM! Standard Vite configuration.

The configuration correctly uses the framework's Config helper and properly references the plugin configuration. Port 4177 is assigned for development.

libs/portal-plugin-template/plugin.config.ts (1)

1-16: LGTM! Well-structured plugin configuration.

The configuration properly handles ESM __dirname derivation and defines appropriate module exposes for the plugin entry point and routes.

libs/portal-plugin-template/src/features/template/Feature.ts (1)

20-26: LGTM! Appropriate placeholder for template.

The empty configuration object with comment provides clear guidance for developers to add feature-specific configuration.

…lib directory exports and improve data formatting

- Updated postcss config to use module.exports syntax
- Enhanced formatTemplateData utility to handle circular references and BigInt values safely
- Refactored routes to use relative component paths
- Consolidated type definitions and utility functions by re-exporting from lib directory
@pcfreak30 pcfreak30 merged commit 31f29d4 into develop Oct 18, 2025
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant