@lucasvu/scope-ui 0.0.8 → 0.1.1
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.
- package/AI_SETUP.md +313 -43
- package/README.md +89 -14
- package/bin/copy-theme-assets.mjs +29 -0
- package/bin/scope-ui-init.mjs +275 -24
- package/dist/chunk-CL3F2TWE.js +1039 -0
- package/dist/core/index.cjs +1052 -0
- package/dist/core/index.d.cts +963 -0
- package/dist/core/index.d.ts +963 -0
- package/dist/core/index.js +1 -0
- package/dist/index.cjs +247 -15
- package/dist/index.d.cts +2 -771
- package/dist/index.d.ts +2 -771
- package/dist/index.js +4 -817
- package/dist/themes/theme-default.css +343 -0
- package/dist/themes/theme-ui-citrus-ink.css +364 -0
- package/dist/themes/theme-ui-custom-crisp.css +969 -0
- package/dist/themes/theme-ui-facebook-blue.css +381 -0
- package/dist/themes/theme-ui-neo-slate.css +962 -0
- package/dist/themes/theme-ui-new-main-fe-sunset.css +1316 -0
- package/dist/themes/theme-ui-new-main-fe.css +343 -0
- package/dist/themes/theme-ui-pure-white.css +377 -0
- package/dist/themes/theme-ui-siraya-vii-light.css +603 -0
- package/dist/themes/theme-ui-solstice-pop.css +1020 -0
- package/dist/themes/theme-ui-uat-aurora.css +962 -0
- package/package.json +20 -4
package/dist/index.js
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
|
+
import { cn, __export } from './chunk-CL3F2TWE.js';
|
|
2
|
+
export { ROOT_CLIENT_THEME_ATTRIBUTE, ROOT_COLOR_MODE_ATTRIBUTE, applyDocumentClientTheme, applyDocumentColorMode, cn, getSystemColorMode, initializeDocumentColorMode, isColorMode, subscribeToSystemColorMode, syncDocumentColorModeToSystem, uiAiManifest, uiDefaultThemePreset, uiProjectAiRules, uiScreenBlueprint, uiScreenBriefFields, uiThemeContract, uiThemeLayerAssets, uiThemePresets } from './chunk-CL3F2TWE.js';
|
|
1
3
|
import { forwardRef, useId, useState, useMemo, useEffect, useRef, useCallback, useLayoutEffect, isValidElement, createElement } from 'react';
|
|
2
4
|
import { cva } from 'class-variance-authority';
|
|
3
5
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
4
6
|
import { createPortal } from 'react-dom';
|
|
5
7
|
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
6
|
-
import {
|
|
8
|
+
import { ArrowUp, ArrowDown, ArrowUpDown, ChevronRight, ChevronLeft, ChevronsLeft, ChevronsRight, ChevronDown } from 'lucide-react';
|
|
7
9
|
|
|
8
|
-
var __defProp = Object.defineProperty;
|
|
9
|
-
var __export = (target, all) => {
|
|
10
|
-
for (var name in all)
|
|
11
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
// src/lib/cn.ts
|
|
15
|
-
function cn(...values) {
|
|
16
|
-
return values.filter(Boolean).join(" ");
|
|
17
|
-
}
|
|
18
10
|
var spinnerSizes = {
|
|
19
11
|
xs: "h-3 w-3",
|
|
20
12
|
sm: "h-4 w-4",
|
|
@@ -6618,809 +6610,4 @@ function PageTitle2({
|
|
|
6618
6610
|
);
|
|
6619
6611
|
}
|
|
6620
6612
|
|
|
6621
|
-
|
|
6622
|
-
var uiAiManifest = {
|
|
6623
|
-
packageName: "@lucasvu/scope-ui",
|
|
6624
|
-
styleImport: "@lucasvu/scope-ui/styles.css",
|
|
6625
|
-
rules: [
|
|
6626
|
-
"Import the stylesheet once at the app entry before rendering any component.",
|
|
6627
|
-
"If the project declares an approved theme preset in AGENTS.md or ui-theme.css, stay inside that preset and do not invent a second palette.",
|
|
6628
|
-
"Collect the screen brief first: route url, sidebar items, active sidebar item, page title, actions, and the page-specific content schema.",
|
|
6629
|
-
"Prefer the canonical component for each intent instead of mixing legacy MainFe components.",
|
|
6630
|
-
"Use Input/Textarea/Select label props directly for simple fields; use Field only to wrap custom controls or grouped content.",
|
|
6631
|
-
"Use Select for small fixed option lists, SearchableSelect for larger local lists, Combobox for type-and-pick flows, and AsyncCombobox for remote search.",
|
|
6632
|
-
'Always provide a stable rowKey to DataTable and use sortMode="server" when sorting happens on the backend.',
|
|
6633
|
-
"Prefer Card as the outer layout section and keep alerts, stats, and tables inside CardContent when building dashboards or forms.",
|
|
6634
|
-
"Do not import MainFe components unless the target explicitly asks for legacy main-fe styling."
|
|
6635
|
-
],
|
|
6636
|
-
components: [
|
|
6637
|
-
{
|
|
6638
|
-
name: "Primary action",
|
|
6639
|
-
importName: "Button",
|
|
6640
|
-
purpose: "Render the main clickable action.",
|
|
6641
|
-
useWhen: [
|
|
6642
|
-
"Submitting a form",
|
|
6643
|
-
"Triggering create/save/confirm flows",
|
|
6644
|
-
"Need loading or block width support"
|
|
6645
|
-
],
|
|
6646
|
-
avoidWhen: [
|
|
6647
|
-
"Pure navigation text links without button semantics"
|
|
6648
|
-
],
|
|
6649
|
-
props: [
|
|
6650
|
-
{ name: "variant", type: "'default' | 'secondary' | 'ghost' | 'outline' | 'destructive' | 'link' | 'confirm' | 'create'", description: "Chooses the visual emphasis." },
|
|
6651
|
-
{ name: "size", type: "'sm' | 'md' | 'lg' | 'icon'", description: "Chooses the button size." },
|
|
6652
|
-
{ name: "block", type: "boolean", description: "Expands the button to full width." },
|
|
6653
|
-
{ name: "loading", type: "boolean", description: "Shows a spinner and disables interaction." }
|
|
6654
|
-
],
|
|
6655
|
-
example: "<Button variant='create' block>Save changes</Button>",
|
|
6656
|
-
related: ["Alert", "Card"]
|
|
6657
|
-
},
|
|
6658
|
-
{
|
|
6659
|
-
name: "Single-line text input",
|
|
6660
|
-
importName: "Input",
|
|
6661
|
-
purpose: "Capture short text, email, password, number-like strings, or search text.",
|
|
6662
|
-
useWhen: [
|
|
6663
|
-
"A single text value is needed",
|
|
6664
|
-
"You need label/helper/error handling built in",
|
|
6665
|
-
"You need prefix, suffix, or password toggle support"
|
|
6666
|
-
],
|
|
6667
|
-
props: [
|
|
6668
|
-
{ name: "label", type: "ReactNode", description: "Field label rendered above the control." },
|
|
6669
|
-
{ name: "helperText", type: "ReactNode", description: "Supplemental guidance shown below." },
|
|
6670
|
-
{ name: "errorMessage", type: "ReactNode", description: "Validation message shown below in error state." },
|
|
6671
|
-
{ name: "prefix", type: "ReactNode", description: "Visual prefix inside the field." },
|
|
6672
|
-
{ name: "suffix", type: "ReactNode", description: "Visual suffix inside the field." }
|
|
6673
|
-
],
|
|
6674
|
-
example: "<Input label='Email' type='email' placeholder='you@example.com' />",
|
|
6675
|
-
related: ["Textarea", "NumericInput", "Field"]
|
|
6676
|
-
},
|
|
6677
|
-
{
|
|
6678
|
-
name: "Multiline text input",
|
|
6679
|
-
importName: "Textarea",
|
|
6680
|
-
purpose: "Capture longer free-form content.",
|
|
6681
|
-
useWhen: [
|
|
6682
|
-
"The user needs multiple lines of text",
|
|
6683
|
-
"A description, note, or comment field is needed"
|
|
6684
|
-
],
|
|
6685
|
-
props: [
|
|
6686
|
-
{ name: "label", type: "ReactNode", description: "Field label rendered above the textarea." },
|
|
6687
|
-
{ name: "rows", type: "number", description: "Controls initial textarea height." },
|
|
6688
|
-
{ name: "helperText", type: "ReactNode", description: "Supplemental guidance shown below." },
|
|
6689
|
-
{ name: "errorMessage", type: "ReactNode", description: "Validation message shown below in error state." }
|
|
6690
|
-
],
|
|
6691
|
-
example: "<Textarea label='Description' rows={5} placeholder='Write the details...' />",
|
|
6692
|
-
related: ["Input", "Field"]
|
|
6693
|
-
},
|
|
6694
|
-
{
|
|
6695
|
-
name: "Single select",
|
|
6696
|
-
importName: "Select",
|
|
6697
|
-
purpose: "Pick one value from a small fixed option set.",
|
|
6698
|
-
useWhen: [
|
|
6699
|
-
"Fewer options and no search is required",
|
|
6700
|
-
"A simple dropdown is enough"
|
|
6701
|
-
],
|
|
6702
|
-
props: [
|
|
6703
|
-
{ name: "options", type: "SelectOption[]", required: true, description: "List of selectable options." },
|
|
6704
|
-
{ name: "label", type: "ReactNode", description: "Field label rendered above the trigger." },
|
|
6705
|
-
{ name: "placeholder", type: "string", description: "Placeholder shown when no value is selected." },
|
|
6706
|
-
{ name: "onChange", type: "(value) => void", description: "Returns the original option value type." }
|
|
6707
|
-
],
|
|
6708
|
-
example: "<Select label='Plan' options={[{ label: 'Starter', value: 'starter' }]} />",
|
|
6709
|
-
related: ["SearchableSelect", "Combobox"]
|
|
6710
|
-
},
|
|
6711
|
-
{
|
|
6712
|
-
name: "Searchable local select",
|
|
6713
|
-
importName: "SearchableSelect",
|
|
6714
|
-
purpose: "Pick one value from a larger in-memory list with search.",
|
|
6715
|
-
useWhen: [
|
|
6716
|
-
"More than a handful of options exist",
|
|
6717
|
-
"Local filtering is enough"
|
|
6718
|
-
],
|
|
6719
|
-
props: [
|
|
6720
|
-
{ name: "options", type: "SearchableSelectOption[]", required: true, description: "List of selectable options." },
|
|
6721
|
-
{ name: "searchPlaceholder", type: "string", description: "Placeholder inside the search field." },
|
|
6722
|
-
{ name: "onSearch", type: "(query) => void", description: "Receives the local search query." }
|
|
6723
|
-
],
|
|
6724
|
-
example: "<SearchableSelect label='Country' searchPlaceholder='Search country' options={countries} />",
|
|
6725
|
-
related: ["Select", "Combobox", "AsyncCombobox"]
|
|
6726
|
-
},
|
|
6727
|
-
{
|
|
6728
|
-
name: "Type and pick",
|
|
6729
|
-
importName: "Combobox",
|
|
6730
|
-
purpose: "Let the user type and choose from a filtered list.",
|
|
6731
|
-
useWhen: [
|
|
6732
|
-
"A command-palette-like input is needed",
|
|
6733
|
-
"The typed text should stay visible in the input"
|
|
6734
|
-
],
|
|
6735
|
-
props: [
|
|
6736
|
-
{ name: "options", type: "ComboboxOption[]", required: true, description: "List of options to filter." },
|
|
6737
|
-
{ name: "value", type: "string | number", description: "Selected value." },
|
|
6738
|
-
{ name: "onChange", type: "(value) => void", description: "Selected value callback." }
|
|
6739
|
-
],
|
|
6740
|
-
example: "<Combobox label='Assignee' options={users} value={assigneeId} onChange={setAssigneeId} />",
|
|
6741
|
-
related: ["SearchableSelect", "AsyncCombobox"]
|
|
6742
|
-
},
|
|
6743
|
-
{
|
|
6744
|
-
name: "Remote search combobox",
|
|
6745
|
-
importName: "AsyncCombobox",
|
|
6746
|
-
purpose: "Search and pick from server-backed data.",
|
|
6747
|
-
useWhen: [
|
|
6748
|
-
"Options are loaded from an API",
|
|
6749
|
-
"Infinite scroll or async fetching is needed"
|
|
6750
|
-
],
|
|
6751
|
-
props: [
|
|
6752
|
-
{ name: "options", type: "ComboboxOption[]", required: true, description: "Currently loaded options." },
|
|
6753
|
-
{ name: "loading", type: "boolean", description: "Shows async loading state." },
|
|
6754
|
-
{ name: "onSearch", type: "(query) => void", required: true, description: "Triggers remote search." },
|
|
6755
|
-
{ name: "onLoadMore", type: "() => void", description: "Loads more options when scrolling near the end." }
|
|
6756
|
-
],
|
|
6757
|
-
example: "<AsyncCombobox label='User' options={options} loading={loading} onSearch={searchUsers} />",
|
|
6758
|
-
related: ["Combobox", "SearchableSelect"]
|
|
6759
|
-
},
|
|
6760
|
-
{
|
|
6761
|
-
name: "Multiple selection",
|
|
6762
|
-
importName: "MultiSelect",
|
|
6763
|
-
purpose: "Choose many values from a searchable list.",
|
|
6764
|
-
useWhen: [
|
|
6765
|
-
"The user can pick multiple tags, users, or filters"
|
|
6766
|
-
],
|
|
6767
|
-
props: [
|
|
6768
|
-
{ name: "options", type: "MultiSelectOption[]", required: true, description: "List of selectable options." },
|
|
6769
|
-
{ name: "value", type: "Array<string | number>", description: "Selected values." },
|
|
6770
|
-
{ name: "onChange", type: "(values) => void", description: "Selected values callback." }
|
|
6771
|
-
],
|
|
6772
|
-
example: "<MultiSelect label='Tags' options={tagOptions} value={tags} onChange={setTags} />",
|
|
6773
|
-
related: ["Select", "SearchableSelect"]
|
|
6774
|
-
},
|
|
6775
|
-
{
|
|
6776
|
-
name: "Structured field wrapper",
|
|
6777
|
-
importName: "Field",
|
|
6778
|
-
purpose: "Add a shared label/helper/error wrapper around custom content.",
|
|
6779
|
-
useWhen: [
|
|
6780
|
-
"Wrapping a custom control that does not expose label props",
|
|
6781
|
-
"Grouping multiple controls under one heading"
|
|
6782
|
-
],
|
|
6783
|
-
avoidWhen: [
|
|
6784
|
-
"A built-in form control already renders its own label and helper text"
|
|
6785
|
-
],
|
|
6786
|
-
props: [
|
|
6787
|
-
{ name: "label", type: "ReactNode", description: "Field label rendered above children." },
|
|
6788
|
-
{ name: "helperText", type: "ReactNode", description: "Helper text below children." },
|
|
6789
|
-
{ name: "errorMessage", type: "ReactNode", description: "Error text below children." },
|
|
6790
|
-
{ name: "htmlFor", type: "string", description: "Associates the label with the wrapped control id." }
|
|
6791
|
-
],
|
|
6792
|
-
example: "<Field label='Schedule' htmlFor='range'><DateRangePicker id='range' /></Field>",
|
|
6793
|
-
related: ["Input", "Textarea", "Select"]
|
|
6794
|
-
},
|
|
6795
|
-
{
|
|
6796
|
-
name: "Data table",
|
|
6797
|
-
importName: "DataTable",
|
|
6798
|
-
purpose: "Render sortable tabular data with optional selection, actions, loading, and pagination.",
|
|
6799
|
-
useWhen: [
|
|
6800
|
-
"Displaying records in rows and columns",
|
|
6801
|
-
"Sort, pagination, selection, or row actions are required"
|
|
6802
|
-
],
|
|
6803
|
-
props: [
|
|
6804
|
-
{ name: "columns", type: "DataTableColumn<T>[]", required: true, description: "Column definitions." },
|
|
6805
|
-
{ name: "data", type: "T[]", required: true, description: "Rows to render." },
|
|
6806
|
-
{ name: "rowKey", type: "keyof T | ((record: T) => string | number)", required: true, description: "Stable key for each row." },
|
|
6807
|
-
{ name: "pagination", type: "DataTablePagination", description: "Enables pagination controls." },
|
|
6808
|
-
{ name: "sortMode", type: "'client' | 'server'", description: "Choose client or backend sorting." }
|
|
6809
|
-
],
|
|
6810
|
-
example: "<DataTable rowKey='id' columns={columns} data={rows} pagination={pagination} />",
|
|
6811
|
-
related: ["Card", "Pagination", "Loading"]
|
|
6812
|
-
},
|
|
6813
|
-
{
|
|
6814
|
-
name: "Status message",
|
|
6815
|
-
importName: "Alert",
|
|
6816
|
-
purpose: "Communicate neutral, success, warning, or danger states.",
|
|
6817
|
-
useWhen: [
|
|
6818
|
-
"You need a visible status or validation banner"
|
|
6819
|
-
],
|
|
6820
|
-
props: [
|
|
6821
|
-
{ name: "tone", type: "'neutral' | 'info' | 'success' | 'warning' | 'danger'", description: "Semantic tone mapping." },
|
|
6822
|
-
{ name: "title", type: "ReactNode", description: "Alert headline." },
|
|
6823
|
-
{ name: "description", type: "ReactNode", description: "Supporting message." }
|
|
6824
|
-
],
|
|
6825
|
-
example: "<Alert tone='warning' title='Missing information' description='Please fill all required fields.' />",
|
|
6826
|
-
related: ["Loading", "Card"]
|
|
6827
|
-
},
|
|
6828
|
-
{
|
|
6829
|
-
name: "Layout section",
|
|
6830
|
-
importName: "Card",
|
|
6831
|
-
purpose: "Wrap a coherent chunk of UI in a bordered surface.",
|
|
6832
|
-
useWhen: [
|
|
6833
|
-
"Building forms, dashboards, settings sections, or summary panels"
|
|
6834
|
-
],
|
|
6835
|
-
props: [
|
|
6836
|
-
{ name: "className", type: "string", description: "Adds layout-specific spacing or width." }
|
|
6837
|
-
],
|
|
6838
|
-
example: "<Card><CardHeader><CardTitle>Account</CardTitle></CardHeader><CardContent>...</CardContent></Card>",
|
|
6839
|
-
related: ["CardHeader", "CardTitle", "CardContent", "CardFooter"]
|
|
6840
|
-
}
|
|
6841
|
-
]
|
|
6842
|
-
};
|
|
6843
|
-
|
|
6844
|
-
// src/screen-blueprint.ts
|
|
6845
|
-
var uiScreenBriefFields = [
|
|
6846
|
-
{
|
|
6847
|
-
id: "pageKind",
|
|
6848
|
-
label: "Page kind",
|
|
6849
|
-
description: "Choose the base recipe for the screen.",
|
|
6850
|
-
required: true,
|
|
6851
|
-
appliesTo: ["all"],
|
|
6852
|
-
example: "list"
|
|
6853
|
-
},
|
|
6854
|
-
{
|
|
6855
|
-
id: "routeUrl",
|
|
6856
|
-
label: "Route URL",
|
|
6857
|
-
description: "Final route for the screen or feature entry.",
|
|
6858
|
-
required: true,
|
|
6859
|
-
appliesTo: ["all"],
|
|
6860
|
-
example: "/admin/users"
|
|
6861
|
-
},
|
|
6862
|
-
{
|
|
6863
|
-
id: "sidebarItems",
|
|
6864
|
-
label: "Sidebar items",
|
|
6865
|
-
description: "Sidebar entries with at least id, title, and href so the shell stays consistent.",
|
|
6866
|
-
required: true,
|
|
6867
|
-
appliesTo: ["all"],
|
|
6868
|
-
example: '[{ id: "users", title: "Users", href: "/admin/users" }]'
|
|
6869
|
-
},
|
|
6870
|
-
{
|
|
6871
|
-
id: "activeSidebarItemId",
|
|
6872
|
-
label: "Active sidebar item id",
|
|
6873
|
-
description: "The sidebar item that should appear active on this screen.",
|
|
6874
|
-
required: true,
|
|
6875
|
-
appliesTo: ["all"],
|
|
6876
|
-
example: "users"
|
|
6877
|
-
},
|
|
6878
|
-
{
|
|
6879
|
-
id: "breadcrumbs",
|
|
6880
|
-
label: "Breadcrumbs",
|
|
6881
|
-
description: "Ordered breadcrumb items for the page header.",
|
|
6882
|
-
required: false,
|
|
6883
|
-
appliesTo: ["all"],
|
|
6884
|
-
example: '[{ label: "Admin", href: "/admin" }, { label: "Users", current: true }]'
|
|
6885
|
-
},
|
|
6886
|
-
{
|
|
6887
|
-
id: "pageTitle",
|
|
6888
|
-
label: "Page title",
|
|
6889
|
-
description: "Main page heading shown in the content header.",
|
|
6890
|
-
required: true,
|
|
6891
|
-
appliesTo: ["all"],
|
|
6892
|
-
example: "Users"
|
|
6893
|
-
},
|
|
6894
|
-
{
|
|
6895
|
-
id: "pageSubtitle",
|
|
6896
|
-
label: "Page subtitle",
|
|
6897
|
-
description: "Short supporting text under the title.",
|
|
6898
|
-
required: false,
|
|
6899
|
-
appliesTo: ["all"],
|
|
6900
|
-
example: "Manage internal user accounts and permissions."
|
|
6901
|
-
},
|
|
6902
|
-
{
|
|
6903
|
-
id: "primaryAction",
|
|
6904
|
-
label: "Primary action",
|
|
6905
|
-
description: "The highest-emphasis action shown in the page header.",
|
|
6906
|
-
required: false,
|
|
6907
|
-
appliesTo: ["all"],
|
|
6908
|
-
example: '{ label: "Create user", href: "/admin/users/create" }'
|
|
6909
|
-
},
|
|
6910
|
-
{
|
|
6911
|
-
id: "secondaryActions",
|
|
6912
|
-
label: "Secondary actions",
|
|
6913
|
-
description: "Additional header actions such as export, refresh, or cancel.",
|
|
6914
|
-
required: false,
|
|
6915
|
-
appliesTo: ["all"],
|
|
6916
|
-
example: '[{ label: "Export" }, { label: "Refresh" }]'
|
|
6917
|
-
},
|
|
6918
|
-
{
|
|
6919
|
-
id: "summaryStats",
|
|
6920
|
-
label: "Summary stats",
|
|
6921
|
-
description: "Top-line numbers for dashboard or overview screens.",
|
|
6922
|
-
required: false,
|
|
6923
|
-
appliesTo: ["dashboard", "detail"],
|
|
6924
|
-
example: '[{ label: "Active users", value: "1,204", trend: "up", delta: "+12%" }]'
|
|
6925
|
-
},
|
|
6926
|
-
{
|
|
6927
|
-
id: "filters",
|
|
6928
|
-
label: "Filters",
|
|
6929
|
-
description: "Filter bar controls shown above list or dashboard content.",
|
|
6930
|
-
required: false,
|
|
6931
|
-
appliesTo: ["list", "dashboard"],
|
|
6932
|
-
example: '[{ type: "search", label: "Search user" }, { type: "select", label: "Role" }]'
|
|
6933
|
-
},
|
|
6934
|
-
{
|
|
6935
|
-
id: "tableColumns",
|
|
6936
|
-
label: "Table columns",
|
|
6937
|
-
description: "Columns for a list table, including label and render intent.",
|
|
6938
|
-
required: false,
|
|
6939
|
-
appliesTo: ["list", "detail", "dashboard"],
|
|
6940
|
-
example: '[{ key: "name", title: "Name" }, { key: "role", title: "Role" }]'
|
|
6941
|
-
},
|
|
6942
|
-
{
|
|
6943
|
-
id: "rowActions",
|
|
6944
|
-
label: "Row actions",
|
|
6945
|
-
description: "Per-row actions for table screens.",
|
|
6946
|
-
required: false,
|
|
6947
|
-
appliesTo: ["list", "detail"],
|
|
6948
|
-
example: '[{ label: "Edit" }, { label: "Reset password" }]'
|
|
6949
|
-
},
|
|
6950
|
-
{
|
|
6951
|
-
id: "formSections",
|
|
6952
|
-
label: "Form sections",
|
|
6953
|
-
description: "Grouped form sections and the fields inside each section.",
|
|
6954
|
-
required: false,
|
|
6955
|
-
appliesTo: ["form"],
|
|
6956
|
-
example: '[{ title: "Basic info", fields: ["name", "email", "role"] }]'
|
|
6957
|
-
},
|
|
6958
|
-
{
|
|
6959
|
-
id: "fields",
|
|
6960
|
-
label: "Fields",
|
|
6961
|
-
description: "Detailed field list with type, label, required state, and helper text.",
|
|
6962
|
-
required: false,
|
|
6963
|
-
appliesTo: ["form", "detail"],
|
|
6964
|
-
example: '[{ name: "email", type: "input", label: "Email", required: true }]'
|
|
6965
|
-
},
|
|
6966
|
-
{
|
|
6967
|
-
id: "detailSections",
|
|
6968
|
-
label: "Detail sections",
|
|
6969
|
-
description: "Cards or sections for detail pages such as profile, activity, permissions, or related records.",
|
|
6970
|
-
required: false,
|
|
6971
|
-
appliesTo: ["detail"],
|
|
6972
|
-
example: '[{ title: "Profile" }, { title: "Recent activity" }]'
|
|
6973
|
-
},
|
|
6974
|
-
{
|
|
6975
|
-
id: "emptyState",
|
|
6976
|
-
label: "Empty state",
|
|
6977
|
-
description: "Fallback title, description, and action when there is no data.",
|
|
6978
|
-
required: false,
|
|
6979
|
-
appliesTo: ["list", "dashboard", "detail"],
|
|
6980
|
-
example: '{ title: "No users yet", description: "Create the first user to get started." }'
|
|
6981
|
-
},
|
|
6982
|
-
{
|
|
6983
|
-
id: "permissions",
|
|
6984
|
-
label: "Permissions",
|
|
6985
|
-
description: "Permission keys that affect sidebar visibility or action availability.",
|
|
6986
|
-
required: false,
|
|
6987
|
-
appliesTo: ["all"],
|
|
6988
|
-
example: '["user.read", "user.write"]'
|
|
6989
|
-
}
|
|
6990
|
-
];
|
|
6991
|
-
var uiScreenBlueprint = {
|
|
6992
|
-
pageKinds: [
|
|
6993
|
-
{
|
|
6994
|
-
id: "list",
|
|
6995
|
-
label: "List page",
|
|
6996
|
-
frame: [
|
|
6997
|
-
"Sidebar shell",
|
|
6998
|
-
"Breadcrumb",
|
|
6999
|
-
"PageTitle with actions",
|
|
7000
|
-
"Optional stats",
|
|
7001
|
-
"Filter card",
|
|
7002
|
-
"DataTable card"
|
|
7003
|
-
]
|
|
7004
|
-
},
|
|
7005
|
-
{
|
|
7006
|
-
id: "form",
|
|
7007
|
-
label: "Form page",
|
|
7008
|
-
frame: [
|
|
7009
|
-
"Sidebar shell",
|
|
7010
|
-
"Breadcrumb",
|
|
7011
|
-
"PageTitle with primary and cancel actions",
|
|
7012
|
-
"Sectioned form cards",
|
|
7013
|
-
"Bottom action row"
|
|
7014
|
-
]
|
|
7015
|
-
},
|
|
7016
|
-
{
|
|
7017
|
-
id: "detail",
|
|
7018
|
-
label: "Detail page",
|
|
7019
|
-
frame: [
|
|
7020
|
-
"Sidebar shell",
|
|
7021
|
-
"Breadcrumb",
|
|
7022
|
-
"PageTitle with status/actions",
|
|
7023
|
-
"Summary stats or metadata card",
|
|
7024
|
-
"Detail cards and related tables"
|
|
7025
|
-
]
|
|
7026
|
-
},
|
|
7027
|
-
{
|
|
7028
|
-
id: "dashboard",
|
|
7029
|
-
label: "Dashboard page",
|
|
7030
|
-
frame: [
|
|
7031
|
-
"Sidebar shell",
|
|
7032
|
-
"Breadcrumb",
|
|
7033
|
-
"PageTitle with actions",
|
|
7034
|
-
"Stat cards row",
|
|
7035
|
-
"Filters",
|
|
7036
|
-
"Main insight cards and tables"
|
|
7037
|
-
]
|
|
7038
|
-
}
|
|
7039
|
-
],
|
|
7040
|
-
workflow: [
|
|
7041
|
-
"Collect the screen brief before coding. Do not invent sidebar items, route urls, filters, fields, or table columns if the brief is missing.",
|
|
7042
|
-
"Use Sidebar plus Breadcrumb and PageTitle to lock the shell before building the page body.",
|
|
7043
|
-
"Choose only canonical root exports from @lucasvu/scope-ui.",
|
|
7044
|
-
"Use Card and ui-grid utilities to create the frame first, then place controls and data components inside.",
|
|
7045
|
-
"Keep all palette, radius, surface, and shadow decisions in the shared ui-theme.css preset file.",
|
|
7046
|
-
"End with a consistency check against the selected preset and the screen brief."
|
|
7047
|
-
],
|
|
7048
|
-
briefFields: uiScreenBriefFields
|
|
7049
|
-
};
|
|
7050
|
-
|
|
7051
|
-
// src/theme-contract.ts
|
|
7052
|
-
var uiThemePresets = [
|
|
7053
|
-
{
|
|
7054
|
-
id: "ocean",
|
|
7055
|
-
label: "Ocean Glass",
|
|
7056
|
-
description: "Blue-cyan preset with clean glass surfaces. Matches the current default visual language.",
|
|
7057
|
-
recommendedFor: [
|
|
7058
|
-
"Admin dashboards",
|
|
7059
|
-
"SaaS CRUD screens",
|
|
7060
|
-
"Projects that want the existing package look"
|
|
7061
|
-
],
|
|
7062
|
-
tokens: {
|
|
7063
|
-
light: {
|
|
7064
|
-
"--tw-background": "0 0% 100%",
|
|
7065
|
-
"--tw-foreground": "222.2 47.4% 11.2%",
|
|
7066
|
-
"--tw-primary": "221.2 83.2% 53.3%",
|
|
7067
|
-
"--tw-accent": "199 89% 48%",
|
|
7068
|
-
"--tw-success": "142.1 76.2% 36.3%",
|
|
7069
|
-
"--tw-destructive": "0 84.2% 60.2%",
|
|
7070
|
-
"--tw-border": "214.3 31.8% 91.4%",
|
|
7071
|
-
"--radius": "0.75rem",
|
|
7072
|
-
"--surface": "rgba(255, 255, 255, 0.92)",
|
|
7073
|
-
"--surface-strong": "rgba(241, 245, 249, 0.96)",
|
|
7074
|
-
"--grey": "rgba(248, 250, 252, 0.96)",
|
|
7075
|
-
"--grey-strong": "rgba(241, 245, 249, 0.98)",
|
|
7076
|
-
"--shadow-sm": "0 10px 28px -18px rgba(15, 23, 42, 0.22)",
|
|
7077
|
-
"--shadow": "0 24px 60px -28px rgba(15, 23, 42, 0.3)",
|
|
7078
|
-
"--primary-grad-from": "199 89% 48%",
|
|
7079
|
-
"--primary-grad-to": "221.2 83.2% 53.3%"
|
|
7080
|
-
},
|
|
7081
|
-
dark: {
|
|
7082
|
-
"--tw-background": "222.2 84% 4.9%",
|
|
7083
|
-
"--tw-foreground": "210 40% 98%",
|
|
7084
|
-
"--tw-primary": "217.2 91.2% 59.8%",
|
|
7085
|
-
"--tw-accent": "199 89% 48%",
|
|
7086
|
-
"--tw-success": "142.1 70.6% 45.3%",
|
|
7087
|
-
"--tw-destructive": "0 62.8% 30.6%",
|
|
7088
|
-
"--tw-border": "217.2 32.6% 17.5%",
|
|
7089
|
-
"--radius": "0.75rem",
|
|
7090
|
-
"--surface": "rgba(15, 23, 42, 0.78)",
|
|
7091
|
-
"--surface-strong": "rgba(30, 41, 59, 0.92)",
|
|
7092
|
-
"--grey": "rgba(30, 41, 59, 0.88)",
|
|
7093
|
-
"--grey-strong": "rgba(51, 65, 85, 0.92)",
|
|
7094
|
-
"--shadow-sm": "0 16px 32px -18px rgba(2, 6, 23, 0.48)",
|
|
7095
|
-
"--shadow": "0 28px 80px -32px rgba(2, 6, 23, 0.7)",
|
|
7096
|
-
"--primary-grad-from": "198.6 88.7% 48.4%",
|
|
7097
|
-
"--primary-grad-to": "221.2 83.2% 53.3%"
|
|
7098
|
-
}
|
|
7099
|
-
}
|
|
7100
|
-
},
|
|
7101
|
-
{
|
|
7102
|
-
id: "sunset",
|
|
7103
|
-
label: "Sunset Ember",
|
|
7104
|
-
description: "Warm orange-coral preset with softer cream surfaces for branded landing or growth products.",
|
|
7105
|
-
recommendedFor: [
|
|
7106
|
-
"Growth products",
|
|
7107
|
-
"Commerce backoffices",
|
|
7108
|
-
"Projects that want a warmer visual tone"
|
|
7109
|
-
],
|
|
7110
|
-
tokens: {
|
|
7111
|
-
light: {
|
|
7112
|
-
"--tw-background": "30 100% 98%",
|
|
7113
|
-
"--tw-foreground": "20 24% 14%",
|
|
7114
|
-
"--tw-primary": "14 90% 56%",
|
|
7115
|
-
"--tw-accent": "29 100% 58%",
|
|
7116
|
-
"--tw-success": "145 63% 38%",
|
|
7117
|
-
"--tw-destructive": "0 78% 58%",
|
|
7118
|
-
"--tw-border": "24 45% 89%",
|
|
7119
|
-
"--radius": "0.85rem",
|
|
7120
|
-
"--surface": "rgba(255, 247, 240, 0.92)",
|
|
7121
|
-
"--surface-strong": "rgba(255, 237, 223, 0.96)",
|
|
7122
|
-
"--grey": "rgba(255, 243, 231, 0.96)",
|
|
7123
|
-
"--grey-strong": "rgba(255, 232, 214, 0.98)",
|
|
7124
|
-
"--shadow-sm": "0 12px 30px -18px rgba(194, 65, 12, 0.18)",
|
|
7125
|
-
"--shadow": "0 28px 64px -30px rgba(154, 52, 18, 0.24)",
|
|
7126
|
-
"--primary-grad-from": "29 100% 58%",
|
|
7127
|
-
"--primary-grad-to": "14 90% 56%"
|
|
7128
|
-
},
|
|
7129
|
-
dark: {
|
|
7130
|
-
"--tw-background": "20 24% 8%",
|
|
7131
|
-
"--tw-foreground": "40 33% 96%",
|
|
7132
|
-
"--tw-primary": "18 100% 62%",
|
|
7133
|
-
"--tw-accent": "35 100% 58%",
|
|
7134
|
-
"--tw-success": "145 60% 47%",
|
|
7135
|
-
"--tw-destructive": "0 73% 52%",
|
|
7136
|
-
"--tw-border": "18 24% 22%",
|
|
7137
|
-
"--radius": "0.85rem",
|
|
7138
|
-
"--surface": "rgba(41, 24, 18, 0.84)",
|
|
7139
|
-
"--surface-strong": "rgba(59, 34, 24, 0.9)",
|
|
7140
|
-
"--grey": "rgba(70, 42, 29, 0.88)",
|
|
7141
|
-
"--grey-strong": "rgba(92, 54, 38, 0.9)",
|
|
7142
|
-
"--shadow-sm": "0 18px 36px -20px rgba(67, 20, 7, 0.48)",
|
|
7143
|
-
"--shadow": "0 30px 84px -34px rgba(67, 20, 7, 0.62)",
|
|
7144
|
-
"--primary-grad-from": "35 100% 58%",
|
|
7145
|
-
"--primary-grad-to": "18 100% 62%"
|
|
7146
|
-
}
|
|
7147
|
-
}
|
|
7148
|
-
},
|
|
7149
|
-
{
|
|
7150
|
-
id: "forest",
|
|
7151
|
-
label: "Forest Mist",
|
|
7152
|
-
description: "Emerald-teal preset with soft botanical surfaces for calmer productivity products.",
|
|
7153
|
-
recommendedFor: [
|
|
7154
|
-
"Operations tools",
|
|
7155
|
-
"Internal platforms",
|
|
7156
|
-
"Products that want a calmer green tone"
|
|
7157
|
-
],
|
|
7158
|
-
tokens: {
|
|
7159
|
-
light: {
|
|
7160
|
-
"--tw-background": "138 40% 98%",
|
|
7161
|
-
"--tw-foreground": "160 25% 14%",
|
|
7162
|
-
"--tw-primary": "158 64% 40%",
|
|
7163
|
-
"--tw-accent": "173 58% 44%",
|
|
7164
|
-
"--tw-success": "145 63% 36%",
|
|
7165
|
-
"--tw-destructive": "0 78% 58%",
|
|
7166
|
-
"--tw-border": "143 21% 88%",
|
|
7167
|
-
"--radius": "0.8rem",
|
|
7168
|
-
"--surface": "rgba(245, 252, 249, 0.92)",
|
|
7169
|
-
"--surface-strong": "rgba(232, 245, 239, 0.96)",
|
|
7170
|
-
"--grey": "rgba(240, 248, 244, 0.96)",
|
|
7171
|
-
"--grey-strong": "rgba(225, 240, 232, 0.98)",
|
|
7172
|
-
"--shadow-sm": "0 12px 28px -18px rgba(5, 86, 66, 0.18)",
|
|
7173
|
-
"--shadow": "0 26px 62px -30px rgba(6, 78, 59, 0.24)",
|
|
7174
|
-
"--primary-grad-from": "173 58% 44%",
|
|
7175
|
-
"--primary-grad-to": "158 64% 40%"
|
|
7176
|
-
},
|
|
7177
|
-
dark: {
|
|
7178
|
-
"--tw-background": "164 35% 8%",
|
|
7179
|
-
"--tw-foreground": "144 35% 96%",
|
|
7180
|
-
"--tw-primary": "160 70% 46%",
|
|
7181
|
-
"--tw-accent": "174 72% 45%",
|
|
7182
|
-
"--tw-success": "145 68% 46%",
|
|
7183
|
-
"--tw-destructive": "0 70% 52%",
|
|
7184
|
-
"--tw-border": "160 20% 20%",
|
|
7185
|
-
"--radius": "0.8rem",
|
|
7186
|
-
"--surface": "rgba(16, 36, 31, 0.84)",
|
|
7187
|
-
"--surface-strong": "rgba(21, 51, 44, 0.9)",
|
|
7188
|
-
"--grey": "rgba(24, 61, 52, 0.88)",
|
|
7189
|
-
"--grey-strong": "rgba(31, 77, 65, 0.9)",
|
|
7190
|
-
"--shadow-sm": "0 18px 34px -20px rgba(1, 44, 34, 0.48)",
|
|
7191
|
-
"--shadow": "0 30px 82px -34px rgba(1, 44, 34, 0.6)",
|
|
7192
|
-
"--primary-grad-from": "174 72% 45%",
|
|
7193
|
-
"--primary-grad-to": "160 70% 46%"
|
|
7194
|
-
}
|
|
7195
|
-
}
|
|
7196
|
-
},
|
|
7197
|
-
{
|
|
7198
|
-
id: "graphite",
|
|
7199
|
-
label: "Graphite Pulse",
|
|
7200
|
-
description: "Neutral slate preset with restrained blue accents for products that need a steadier enterprise tone.",
|
|
7201
|
-
recommendedFor: [
|
|
7202
|
-
"Enterprise admin panels",
|
|
7203
|
-
"B2B internal tools",
|
|
7204
|
-
"Projects that want a more neutral interface"
|
|
7205
|
-
],
|
|
7206
|
-
tokens: {
|
|
7207
|
-
light: {
|
|
7208
|
-
"--tw-background": "220 18% 97%",
|
|
7209
|
-
"--tw-foreground": "222 24% 14%",
|
|
7210
|
-
"--tw-primary": "221 24% 32%",
|
|
7211
|
-
"--tw-accent": "198 83% 44%",
|
|
7212
|
-
"--tw-success": "160 56% 38%",
|
|
7213
|
-
"--tw-destructive": "0 72% 54%",
|
|
7214
|
-
"--tw-border": "218 17% 86%",
|
|
7215
|
-
"--radius": "0.7rem",
|
|
7216
|
-
"--surface": "rgba(248, 250, 252, 0.94)",
|
|
7217
|
-
"--surface-strong": "rgba(226, 232, 240, 0.96)",
|
|
7218
|
-
"--grey": "rgba(241, 245, 249, 0.98)",
|
|
7219
|
-
"--grey-strong": "rgba(226, 232, 240, 0.99)",
|
|
7220
|
-
"--shadow-sm": "0 12px 30px -20px rgba(15, 23, 42, 0.18)",
|
|
7221
|
-
"--shadow": "0 28px 66px -30px rgba(15, 23, 42, 0.24)",
|
|
7222
|
-
"--primary-grad-from": "198 83% 44%",
|
|
7223
|
-
"--primary-grad-to": "221 24% 32%"
|
|
7224
|
-
},
|
|
7225
|
-
dark: {
|
|
7226
|
-
"--tw-background": "222 32% 8%",
|
|
7227
|
-
"--tw-foreground": "210 25% 96%",
|
|
7228
|
-
"--tw-primary": "210 24% 82%",
|
|
7229
|
-
"--tw-accent": "192 92% 52%",
|
|
7230
|
-
"--tw-success": "158 64% 45%",
|
|
7231
|
-
"--tw-destructive": "0 72% 56%",
|
|
7232
|
-
"--tw-border": "217 19% 24%",
|
|
7233
|
-
"--radius": "0.7rem",
|
|
7234
|
-
"--surface": "rgba(15, 23, 42, 0.82)",
|
|
7235
|
-
"--surface-strong": "rgba(30, 41, 59, 0.92)",
|
|
7236
|
-
"--grey": "rgba(30, 41, 59, 0.9)",
|
|
7237
|
-
"--grey-strong": "rgba(51, 65, 85, 0.92)",
|
|
7238
|
-
"--shadow-sm": "0 18px 38px -22px rgba(2, 6, 23, 0.48)",
|
|
7239
|
-
"--shadow": "0 32px 88px -34px rgba(2, 6, 23, 0.68)",
|
|
7240
|
-
"--primary-grad-from": "192 92% 52%",
|
|
7241
|
-
"--primary-grad-to": "210 24% 82%"
|
|
7242
|
-
}
|
|
7243
|
-
}
|
|
7244
|
-
}
|
|
7245
|
-
];
|
|
7246
|
-
var uiDefaultThemePreset = uiThemePresets[0];
|
|
7247
|
-
function createThemePresetCssExample(themePreset) {
|
|
7248
|
-
const renderBlock = (tokens) => Object.entries(tokens).map(([token, value]) => ` ${token}: ${value};`).join("\n");
|
|
7249
|
-
return `:root {
|
|
7250
|
-
${renderBlock(themePreset.tokens.light)}
|
|
7251
|
-
}
|
|
7252
|
-
|
|
7253
|
-
.dark,
|
|
7254
|
-
[data-ui-theme='dark'] {
|
|
7255
|
-
${renderBlock(themePreset.tokens.dark)}
|
|
7256
|
-
}`;
|
|
7257
|
-
}
|
|
7258
|
-
var uiThemeContract = {
|
|
7259
|
-
packageName: "@lucasvu/scope-ui",
|
|
7260
|
-
importOrder: [
|
|
7261
|
-
"import '@lucasvu/scope-ui/styles.css'",
|
|
7262
|
-
"import './styles/ui-theme.css'"
|
|
7263
|
-
],
|
|
7264
|
-
selectors: {
|
|
7265
|
-
light: [":root", "[data-ui-theme='light']"],
|
|
7266
|
-
dark: [".dark", "[data-ui-theme='dark']"]
|
|
7267
|
-
},
|
|
7268
|
-
overrideFile: "src/styles/ui-theme.css",
|
|
7269
|
-
defaultPreset: uiDefaultThemePreset.id,
|
|
7270
|
-
presets: uiThemePresets,
|
|
7271
|
-
rules: [
|
|
7272
|
-
"Import the package stylesheet before your project theme override stylesheet.",
|
|
7273
|
-
"Choose one approved preset and keep the entire project on that preset instead of mixing palettes page by page.",
|
|
7274
|
-
"Override tokens in one shared theme file instead of scattering colors across components.",
|
|
7275
|
-
"Use :root for the default light theme and .dark or [data-ui-theme='dark'] for dark theme.",
|
|
7276
|
-
"Only override tokens declared here. Do not patch component internals unless you are extending the library.",
|
|
7277
|
-
"For AI-generated screens, choose one theme source of truth and keep component code token-driven."
|
|
7278
|
-
],
|
|
7279
|
-
tokens: [
|
|
7280
|
-
{
|
|
7281
|
-
name: "--tw-background",
|
|
7282
|
-
description: "Base app background in HSL triplet format.",
|
|
7283
|
-
defaultLight: "0 0% 100%",
|
|
7284
|
-
defaultDark: "222.2 84% 4.9%",
|
|
7285
|
-
usedBy: ["body background", "Input fallback", "page background"]
|
|
7286
|
-
},
|
|
7287
|
-
{
|
|
7288
|
-
name: "--tw-foreground",
|
|
7289
|
-
description: "Primary text color in HSL triplet format.",
|
|
7290
|
-
defaultLight: "222.2 47.4% 11.2%",
|
|
7291
|
-
defaultDark: "210 40% 98%",
|
|
7292
|
-
usedBy: ["Button", "Input", "Card", "Typography"]
|
|
7293
|
-
},
|
|
7294
|
-
{
|
|
7295
|
-
name: "--tw-primary",
|
|
7296
|
-
description: "Primary brand color in HSL triplet format.",
|
|
7297
|
-
defaultLight: "221.2 83.2% 53.3%",
|
|
7298
|
-
defaultDark: "217.2 91.2% 59.8%",
|
|
7299
|
-
usedBy: ["Button", "focus rings", "brand emphasis"]
|
|
7300
|
-
},
|
|
7301
|
-
{
|
|
7302
|
-
name: "--tw-accent",
|
|
7303
|
-
description: "Accent color in HSL triplet format.",
|
|
7304
|
-
defaultLight: "199 89% 48%",
|
|
7305
|
-
defaultDark: "199 89% 48%",
|
|
7306
|
-
usedBy: ["Tabs", "checkbox accent", "highlight states"]
|
|
7307
|
-
},
|
|
7308
|
-
{
|
|
7309
|
-
name: "--tw-success",
|
|
7310
|
-
description: "Success state color in HSL triplet format.",
|
|
7311
|
-
defaultLight: "142.1 76.2% 36.3%",
|
|
7312
|
-
defaultDark: "142.1 70.6% 45.3%",
|
|
7313
|
-
usedBy: ["Alert", "confirm buttons", "status text"]
|
|
7314
|
-
},
|
|
7315
|
-
{
|
|
7316
|
-
name: "--tw-destructive",
|
|
7317
|
-
description: "Danger state color in HSL triplet format.",
|
|
7318
|
-
defaultLight: "0 84.2% 60.2%",
|
|
7319
|
-
defaultDark: "0 62.8% 30.6%",
|
|
7320
|
-
usedBy: ["Alert", "destructive buttons", "error states"]
|
|
7321
|
-
},
|
|
7322
|
-
{
|
|
7323
|
-
name: "--tw-border",
|
|
7324
|
-
description: "Border color in HSL triplet format.",
|
|
7325
|
-
defaultLight: "214.3 31.8% 91.4%",
|
|
7326
|
-
defaultDark: "217.2 32.6% 17.5%",
|
|
7327
|
-
usedBy: ["Input", "Select", "Card", "DataTable"]
|
|
7328
|
-
},
|
|
7329
|
-
{
|
|
7330
|
-
name: "--radius",
|
|
7331
|
-
description: "Shared component radius.",
|
|
7332
|
-
defaultLight: "0.75rem",
|
|
7333
|
-
defaultDark: "0.75rem",
|
|
7334
|
-
usedBy: ["Button", "Input", "Card", "Tabs"]
|
|
7335
|
-
},
|
|
7336
|
-
{
|
|
7337
|
-
name: "--surface",
|
|
7338
|
-
description: "Default surface background as a CSS color.",
|
|
7339
|
-
defaultLight: "rgba(255, 255, 255, 0.92)",
|
|
7340
|
-
defaultDark: "rgba(15, 23, 42, 0.78)",
|
|
7341
|
-
usedBy: ["Tabs", "Pagination", "glass surfaces"]
|
|
7342
|
-
},
|
|
7343
|
-
{
|
|
7344
|
-
name: "--surface-strong",
|
|
7345
|
-
description: "Stronger elevated surface as a CSS color.",
|
|
7346
|
-
defaultLight: "rgba(241, 245, 249, 0.96)",
|
|
7347
|
-
defaultDark: "rgba(30, 41, 59, 0.92)",
|
|
7348
|
-
usedBy: ["Pagination hover", "raised surfaces"]
|
|
7349
|
-
},
|
|
7350
|
-
{
|
|
7351
|
-
name: "--grey",
|
|
7352
|
-
description: "Neutral table/header background as a CSS color.",
|
|
7353
|
-
defaultLight: "rgba(248, 250, 252, 0.96)",
|
|
7354
|
-
defaultDark: "rgba(30, 41, 59, 0.88)",
|
|
7355
|
-
usedBy: ["DataTable header"]
|
|
7356
|
-
},
|
|
7357
|
-
{
|
|
7358
|
-
name: "--grey-strong",
|
|
7359
|
-
description: "Hover background for neutral rows as a CSS color.",
|
|
7360
|
-
defaultLight: "rgba(241, 245, 249, 0.98)",
|
|
7361
|
-
defaultDark: "rgba(51, 65, 85, 0.92)",
|
|
7362
|
-
usedBy: ["DataTable row hover"]
|
|
7363
|
-
},
|
|
7364
|
-
{
|
|
7365
|
-
name: "--shadow-sm",
|
|
7366
|
-
description: "Small elevation shadow.",
|
|
7367
|
-
defaultLight: "0 10px 28px -18px rgba(15, 23, 42, 0.22)",
|
|
7368
|
-
defaultDark: "0 16px 32px -18px rgba(2, 6, 23, 0.48)",
|
|
7369
|
-
usedBy: ["Tabs", "Pagination", "subtle elevation"]
|
|
7370
|
-
},
|
|
7371
|
-
{
|
|
7372
|
-
name: "--shadow",
|
|
7373
|
-
description: "Primary elevation shadow.",
|
|
7374
|
-
defaultLight: "0 24px 60px -28px rgba(15, 23, 42, 0.3)",
|
|
7375
|
-
defaultDark: "0 28px 80px -32px rgba(2, 6, 23, 0.7)",
|
|
7376
|
-
usedBy: ["Card", "Button emphasis", "floating surfaces"]
|
|
7377
|
-
},
|
|
7378
|
-
{
|
|
7379
|
-
name: "--text",
|
|
7380
|
-
description: "Generic text color alias as a CSS color.",
|
|
7381
|
-
defaultLight: "hsl(var(--tw-foreground))",
|
|
7382
|
-
defaultDark: "hsl(var(--tw-foreground))",
|
|
7383
|
-
usedBy: ["Pagination", "legacy utility surfaces"]
|
|
7384
|
-
},
|
|
7385
|
-
{
|
|
7386
|
-
name: "--muted",
|
|
7387
|
-
description: "Generic muted text color alias as a CSS color.",
|
|
7388
|
-
defaultLight: "hsl(var(--tw-muted-foreground))",
|
|
7389
|
-
defaultDark: "hsl(var(--tw-muted-foreground))",
|
|
7390
|
-
usedBy: ["Pagination", "DataTable sort icon", "helper text"]
|
|
7391
|
-
},
|
|
7392
|
-
{
|
|
7393
|
-
name: "--accent",
|
|
7394
|
-
description: "Generic accent color alias as a CSS color.",
|
|
7395
|
-
defaultLight: "hsl(var(--tw-accent))",
|
|
7396
|
-
defaultDark: "hsl(var(--tw-accent))",
|
|
7397
|
-
usedBy: ["DataTable checkbox accent", "focus accents"]
|
|
7398
|
-
},
|
|
7399
|
-
{
|
|
7400
|
-
name: "--primary-grad-from",
|
|
7401
|
-
description: "Gradient start color in HSL triplet format.",
|
|
7402
|
-
defaultLight: "199 89% 48%",
|
|
7403
|
-
defaultDark: "198.6 88.7% 48.4%",
|
|
7404
|
-
usedBy: ["Button variant create"]
|
|
7405
|
-
},
|
|
7406
|
-
{
|
|
7407
|
-
name: "--primary-grad-to",
|
|
7408
|
-
description: "Gradient end color in HSL triplet format.",
|
|
7409
|
-
defaultLight: "221.2 83.2% 53.3%",
|
|
7410
|
-
defaultDark: "221.2 83.2% 53.3%",
|
|
7411
|
-
usedBy: ["Button variant create"]
|
|
7412
|
-
}
|
|
7413
|
-
],
|
|
7414
|
-
exampleCss: createThemePresetCssExample(uiDefaultThemePreset)
|
|
7415
|
-
};
|
|
7416
|
-
var uiProjectAiRules = [
|
|
7417
|
-
"Use @lucasvu/scope-ui as the default UI library.",
|
|
7418
|
-
"Import @lucasvu/scope-ui/styles.css once at the app entry.",
|
|
7419
|
-
"Import the project override theme file after the package stylesheet.",
|
|
7420
|
-
"Stay inside the approved theme preset declared by the project and do not invent a second palette.",
|
|
7421
|
-
"Read uiAiManifest to choose the correct component by intent before coding.",
|
|
7422
|
-
"Read uiThemeContract before changing colors, shadows, radius, or theme behavior.",
|
|
7423
|
-
"Prefer root exports and avoid MainFe unless the task explicitly targets a legacy screen."
|
|
7424
|
-
];
|
|
7425
|
-
|
|
7426
|
-
export { Alert, ArgonSidebar, AsyncCombobox, Badge, Breadcrumb, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Combobox, FormControl as Control, DataTable, FormDescription as Description, FormField as Field, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Input, FormItem as Item, FormLabel as Label, LineClampTooltip, Loading, main_fe_exports as MainFe, FormMessage as Message, MultiSelect, NumericInput, OverflowTooltip, PageTitle, Pagination, SearchableSelect, SectionTitle, Select, Sidebar, SidebarItem, Stat, Table, TableBody, TableCell, TableHeader, TableRow, Tabs, Textarea, Tooltip, TruncatedText, cn, defaultPermissionChecker, filterSidebarItems, hasActiveDescendant, uiAiManifest, uiDefaultThemePreset, uiProjectAiRules, uiScreenBlueprint, uiScreenBriefFields, uiThemeContract, uiThemePresets };
|
|
6613
|
+
export { Alert, ArgonSidebar, AsyncCombobox, Badge, Breadcrumb, Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Combobox, FormControl as Control, DataTable, FormDescription as Description, FormField as Field, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, Input, FormItem as Item, FormLabel as Label, LineClampTooltip, Loading, main_fe_exports as MainFe, FormMessage as Message, MultiSelect, NumericInput, OverflowTooltip, PageTitle, Pagination, SearchableSelect, SectionTitle, Select, Sidebar, SidebarItem, Stat, Table, TableBody, TableCell, TableHeader, TableRow, Tabs, Textarea, Tooltip, TruncatedText, defaultPermissionChecker, filterSidebarItems, hasActiveDescendant };
|