@duro-app/cli 5.4.0 → 5.6.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.
- package/package.json +5 -5
- package/registry.json +476 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duro-app/cli",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "Machine-queryable docs for the Duro design system: components, props, recipes, tokens and rules as CLI output, JSON, or an MCP server.",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"@modelcontextprotocol/sdk": ">=1.0.0",
|
|
48
|
-
"@duro-app/ui": "^5.
|
|
48
|
+
"@duro-app/ui": "^5.6.0"
|
|
49
49
|
},
|
|
50
50
|
"peerDependenciesMeta": {
|
|
51
51
|
"@duro-app/ui": {
|
|
@@ -60,9 +60,9 @@
|
|
|
60
60
|
"@types/node": "^24.0.0",
|
|
61
61
|
"ts-morph": "^26.0.0",
|
|
62
62
|
"typescript": "^5.7.0",
|
|
63
|
-
"@duro-app/eslint-plugin": "^5.
|
|
64
|
-
"@duro-app/
|
|
65
|
-
"@duro-app/
|
|
63
|
+
"@duro-app/eslint-plugin": "^5.6.0",
|
|
64
|
+
"@duro-app/tokens": "^5.6.0",
|
|
65
|
+
"@duro-app/ui": "^5.6.0"
|
|
66
66
|
},
|
|
67
67
|
"scripts": {
|
|
68
68
|
"registry": "node scripts/build-registry.mjs",
|
package/registry.json
CHANGED
|
@@ -273,6 +273,93 @@
|
|
|
273
273
|
],
|
|
274
274
|
"sourcePath": "packages/ui/src/components/Badge/Badge.tsx"
|
|
275
275
|
},
|
|
276
|
+
"Breadcrumb": {
|
|
277
|
+
"importPath": "@duro-app/ui",
|
|
278
|
+
"kind": "compound",
|
|
279
|
+
"meta": {
|
|
280
|
+
"anatomy": {
|
|
281
|
+
"required": [
|
|
282
|
+
"Root",
|
|
283
|
+
"Item"
|
|
284
|
+
]
|
|
285
|
+
},
|
|
286
|
+
"description": "Where the current page sits in the hierarchy: a labelled nav landmark with an ordered list of links, outermost first. An Item is either a link (href, optional onNavigate) or the current page (current: text with aria-current=\"page\"), never both — the types refuse the mix. The › separators are aria-hidden. Links take href and an optional onNavigate(href, event) for a client router (plain clicks only). Compound component — Root is required.",
|
|
287
|
+
"example": "<Breadcrumb.Root aria-label=\"Breadcrumb\">\n <Breadcrumb.Item href=\"/docs\" onNavigate={go}>Docs</Breadcrumb.Item>\n <Breadcrumb.Item href=\"/docs/architecture\" onNavigate={go}>Architecture</Breadcrumb.Item>\n <Breadcrumb.Item current>AI-ops platform</Breadcrumb.Item>\n</Breadcrumb.Root>\n\n// go = (href, event) => { event.preventDefault(); navigate(href) }",
|
|
288
|
+
"relatedTo": [
|
|
289
|
+
{
|
|
290
|
+
"component": "PageNav",
|
|
291
|
+
"kind": "contrast",
|
|
292
|
+
"relationship": "Breadcrumb goes up the hierarchy; PageNav goes along the reading order"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"component": "admin-detail-page",
|
|
296
|
+
"kind": "composition",
|
|
297
|
+
"relationship": "The admin-detail-page recipe heads the record with a Breadcrumb"
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
"whenNotToUse": [
|
|
301
|
+
"The previous and next pages in reading order — use PageNav",
|
|
302
|
+
"The sections of the page being read — use TableOfContents",
|
|
303
|
+
"Primary app navigation — use SideNav"
|
|
304
|
+
],
|
|
305
|
+
"whenToUse": [
|
|
306
|
+
"A page deep in a hierarchy — docs › section › page, admin › collection › record",
|
|
307
|
+
"A detail page whose way back to its collection should be one click"
|
|
308
|
+
]
|
|
309
|
+
},
|
|
310
|
+
"name": "Breadcrumb",
|
|
311
|
+
"parts": {
|
|
312
|
+
"Item": {
|
|
313
|
+
"name": "Item",
|
|
314
|
+
"props": [
|
|
315
|
+
{
|
|
316
|
+
"name": "children",
|
|
317
|
+
"required": true,
|
|
318
|
+
"type": "ReactNode"
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"description": "Where the item links to.",
|
|
322
|
+
"name": "href",
|
|
323
|
+
"required": false,
|
|
324
|
+
"type": "string"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"description": "Client-side navigation: called for a plain primary click (no modifier key). Call `event.preventDefault()`, then your router's navigate.",
|
|
328
|
+
"name": "onNavigate",
|
|
329
|
+
"required": false,
|
|
330
|
+
"type": "OnNavigate"
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"description": "The page the user is on: rendered as text with `aria-current=\"page\"`.",
|
|
334
|
+
"name": "current",
|
|
335
|
+
"required": false,
|
|
336
|
+
"type": "true"
|
|
337
|
+
}
|
|
338
|
+
],
|
|
339
|
+
"sourcePath": "packages/ui/src/components/Breadcrumb/Breadcrumb.tsx"
|
|
340
|
+
},
|
|
341
|
+
"Root": {
|
|
342
|
+
"name": "Root",
|
|
343
|
+
"props": [
|
|
344
|
+
{
|
|
345
|
+
"description": "Names the landmark (\"Breadcrumb\"); required, from your text catalog.",
|
|
346
|
+
"name": "aria-label",
|
|
347
|
+
"required": true,
|
|
348
|
+
"type": "string"
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"description": "`Breadcrumb.Item`s, outermost first.",
|
|
352
|
+
"name": "children",
|
|
353
|
+
"required": true,
|
|
354
|
+
"type": "ReactNode"
|
|
355
|
+
}
|
|
356
|
+
],
|
|
357
|
+
"sourcePath": "packages/ui/src/components/Breadcrumb/Breadcrumb.tsx"
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"props": null,
|
|
361
|
+
"sourcePath": "packages/ui/src/components/Breadcrumb/Breadcrumb.tsx"
|
|
362
|
+
},
|
|
276
363
|
"Button": {
|
|
277
364
|
"importPath": "@duro-app/ui",
|
|
278
365
|
"kind": "component",
|
|
@@ -2485,7 +2572,15 @@
|
|
|
2485
2572
|
"description": "Gap between child elements",
|
|
2486
2573
|
"name": "gap",
|
|
2487
2574
|
"required": false,
|
|
2488
|
-
"type": "FieldsetGap"
|
|
2575
|
+
"type": "FieldsetGap",
|
|
2576
|
+
"union": [
|
|
2577
|
+
"xs",
|
|
2578
|
+
"sm",
|
|
2579
|
+
"ms",
|
|
2580
|
+
"md",
|
|
2581
|
+
"lg",
|
|
2582
|
+
"xl"
|
|
2583
|
+
]
|
|
2489
2584
|
},
|
|
2490
2585
|
{
|
|
2491
2586
|
"name": "children",
|
|
@@ -2831,12 +2926,13 @@
|
|
|
2831
2926
|
],
|
|
2832
2927
|
"whenNotToUse": [
|
|
2833
2928
|
"Items that should wrap to the next line — use Cluster",
|
|
2834
|
-
"Vertical stacking — use Stack"
|
|
2929
|
+
"Vertical stacking — use Stack",
|
|
2930
|
+
"A breadcrumb trail — use Breadcrumb (a nav landmark with aria-current)"
|
|
2835
2931
|
],
|
|
2836
2932
|
"whenToUse": [
|
|
2837
2933
|
"Toolbar or button group that must stay on one row",
|
|
2838
2934
|
"Horizontal alignment of a known, small number of items",
|
|
2839
|
-
"Icon + text pairs,
|
|
2935
|
+
"Icon + text pairs, action rows"
|
|
2840
2936
|
]
|
|
2841
2937
|
},
|
|
2842
2938
|
"name": "Inline",
|
|
@@ -3200,7 +3296,7 @@
|
|
|
3200
3296
|
"importPath": "@duro-app/ui",
|
|
3201
3297
|
"kind": "component",
|
|
3202
3298
|
"meta": {
|
|
3203
|
-
"description": "Button-styled hyperlink. Renders an <a> tag, not a <button>. Use for navigation, not actions.",
|
|
3299
|
+
"description": "Button-styled hyperlink. Renders an <a> tag, not a <button>. Use for navigation, not actions. onNavigate(href, event) hands a plain primary click to a client router (the app calls event.preventDefault(), then navigates); modified clicks keep the browser default.",
|
|
3204
3300
|
"example": "<LinkButton href=\"/signup\" variant=\"primary\">\n Get started\n</LinkButton>\n\n<LinkButton href=\"https://docs.example.com\" target=\"_blank\" variant=\"secondary\">\n Read the docs\n</LinkButton>",
|
|
3205
3301
|
"relatedTo": [
|
|
3206
3302
|
{
|
|
@@ -3261,6 +3357,12 @@
|
|
|
3261
3357
|
"required": false,
|
|
3262
3358
|
"type": "string"
|
|
3263
3359
|
},
|
|
3360
|
+
{
|
|
3361
|
+
"description": "Client-side navigation: called for a plain primary click (no modifier key, no `target`); the browser default runs for every other click. Call `event.preventDefault()`, then your router's navigate.",
|
|
3362
|
+
"name": "onNavigate",
|
|
3363
|
+
"required": false,
|
|
3364
|
+
"type": "OnNavigate"
|
|
3365
|
+
},
|
|
3264
3366
|
{
|
|
3265
3367
|
"name": "children",
|
|
3266
3368
|
"required": true,
|
|
@@ -3642,7 +3744,7 @@
|
|
|
3642
3744
|
"Item"
|
|
3643
3745
|
]
|
|
3644
3746
|
},
|
|
3645
|
-
"description": "Dropdown action menu. Triggers actions (not value selection). Compound component — Root is required (throws without it). Menu.Trigger renders the button itself: give it the label (text, an Icon), never a Button; an icon-only trigger takes aria-label, and variant=\"ghost\" suits toolbars. The popup is portalled and placed against the trigger (never clipped by a sticky or overflow ancestor), capped at sizes.listMaxH with scrolling, and takes focus on open (WAI-ARIA menu button); Escape closes only the menu, not an enclosing Popover or Dialog.",
|
|
3747
|
+
"description": "Dropdown action menu. Triggers actions (not value selection). Compound component — Root is required (throws without it). Menu.Trigger renders the button itself: give it the label (text, an Icon), never a Button; an icon-only trigger takes aria-label, and variant=\"ghost\" suits toolbars; size=\"small\" matches small Toggles and Buttons (a small ghost trigger is iconButtonSm). The popup is portalled and placed against the trigger (never clipped by a sticky or overflow ancestor), capped at sizes.listMaxH with scrolling, and takes focus on open (WAI-ARIA menu button); Escape closes only the menu, not an enclosing Popover or Dialog.",
|
|
3646
3748
|
"example": "<Menu.Root>\n <Menu.Trigger>Actions</Menu.Trigger>\n <Menu.Popup>\n <Menu.Item onClick={() => console.log('edit')}>Edit</Menu.Item>\n <Menu.Item onClick={() => console.log('duplicate')}>Duplicate</Menu.Item>\n <Menu.Separator />\n <Menu.LinkItem href=\"/settings\">Settings</Menu.LinkItem>\n </Menu.Popup>\n</Menu.Root>",
|
|
3647
3749
|
"relatedTo": [
|
|
3648
3750
|
{
|
|
@@ -3774,6 +3876,17 @@
|
|
|
3774
3876
|
"required": false,
|
|
3775
3877
|
"type": "MenuTriggerVariant"
|
|
3776
3878
|
},
|
|
3879
|
+
{
|
|
3880
|
+
"default": "'default'",
|
|
3881
|
+
"description": "`small` matches a small Toggle or Button beside it; a small ghost trigger is `iconButtonSm`. Default: `default`.",
|
|
3882
|
+
"name": "size",
|
|
3883
|
+
"required": false,
|
|
3884
|
+
"type": "ControlSize",
|
|
3885
|
+
"union": [
|
|
3886
|
+
"default",
|
|
3887
|
+
"small"
|
|
3888
|
+
]
|
|
3889
|
+
},
|
|
3777
3890
|
{
|
|
3778
3891
|
"name": "ref",
|
|
3779
3892
|
"required": false,
|
|
@@ -3859,6 +3972,124 @@
|
|
|
3859
3972
|
],
|
|
3860
3973
|
"sourcePath": "packages/diagrams/src/components/Node/Node.tsx"
|
|
3861
3974
|
},
|
|
3975
|
+
"PageNav": {
|
|
3976
|
+
"importPath": "@duro-app/ui",
|
|
3977
|
+
"kind": "compound",
|
|
3978
|
+
"meta": {
|
|
3979
|
+
"anatomy": {
|
|
3980
|
+
"optional": [
|
|
3981
|
+
"Prev",
|
|
3982
|
+
"Next"
|
|
3983
|
+
],
|
|
3984
|
+
"required": [
|
|
3985
|
+
"Root"
|
|
3986
|
+
]
|
|
3987
|
+
},
|
|
3988
|
+
"description": "The previous and next pages in reading order, at the foot of a page: a labelled nav with up to two link cards (a direction label over the page title, both from props). A missing side keeps its slot, so Next stays right-aligned; the cards stack below the xs container width. Links take href and an optional onNavigate(href, event) (plain clicks only). Compound component — Root is required.",
|
|
3989
|
+
"example": "<PageNav.Root aria-label=\"Pages\">\n <PageNav.Prev href=\"/docs/architecture/clusters\" label=\"Previous\" title=\"Clusters and bootstrap\" onNavigate={go} />\n <PageNav.Next href=\"/docs/architecture/secrets\" label=\"Next\" title=\"Secrets and Vault\" onNavigate={go} />\n</PageNav.Root>",
|
|
3990
|
+
"relatedTo": [
|
|
3991
|
+
{
|
|
3992
|
+
"component": "Breadcrumb",
|
|
3993
|
+
"kind": "contrast",
|
|
3994
|
+
"relationship": "PageNav goes along the reading order; Breadcrumb goes up the hierarchy"
|
|
3995
|
+
},
|
|
3996
|
+
{
|
|
3997
|
+
"component": "Card",
|
|
3998
|
+
"kind": "contrast",
|
|
3999
|
+
"relationship": "PageNav draws its own link cards; do not wrap a Card in a link to fake a prev/next pair"
|
|
4000
|
+
}
|
|
4001
|
+
],
|
|
4002
|
+
"whenNotToUse": [
|
|
4003
|
+
"Numbered result pages of a table — use Pagination from @duro-app/ui/table",
|
|
4004
|
+
"Going up the hierarchy — use Breadcrumb"
|
|
4005
|
+
],
|
|
4006
|
+
"whenToUse": [
|
|
4007
|
+
"Docs or a guide read in order — the foot of each page",
|
|
4008
|
+
"A sequence of steps where each step is its own page"
|
|
4009
|
+
]
|
|
4010
|
+
},
|
|
4011
|
+
"name": "PageNav",
|
|
4012
|
+
"parts": {
|
|
4013
|
+
"Next": {
|
|
4014
|
+
"name": "Next",
|
|
4015
|
+
"props": [
|
|
4016
|
+
{
|
|
4017
|
+
"name": "href",
|
|
4018
|
+
"required": true,
|
|
4019
|
+
"type": "string"
|
|
4020
|
+
},
|
|
4021
|
+
{
|
|
4022
|
+
"description": "The page's title.",
|
|
4023
|
+
"name": "title",
|
|
4024
|
+
"required": true,
|
|
4025
|
+
"type": "ReactNode"
|
|
4026
|
+
},
|
|
4027
|
+
{
|
|
4028
|
+
"description": "The direction label above the title (\"Previous\", \"Next\"), from your text catalog.",
|
|
4029
|
+
"name": "label",
|
|
4030
|
+
"required": true,
|
|
4031
|
+
"type": "ReactNode"
|
|
4032
|
+
},
|
|
4033
|
+
{
|
|
4034
|
+
"description": "Client-side navigation: called for a plain primary click (no modifier key). Call `event.preventDefault()`, then your router's navigate.",
|
|
4035
|
+
"name": "onNavigate",
|
|
4036
|
+
"required": false,
|
|
4037
|
+
"type": "OnNavigate"
|
|
4038
|
+
}
|
|
4039
|
+
],
|
|
4040
|
+
"sourcePath": "packages/ui/src/components/PageNav/PageNav.tsx"
|
|
4041
|
+
},
|
|
4042
|
+
"Prev": {
|
|
4043
|
+
"name": "Prev",
|
|
4044
|
+
"props": [
|
|
4045
|
+
{
|
|
4046
|
+
"name": "href",
|
|
4047
|
+
"required": true,
|
|
4048
|
+
"type": "string"
|
|
4049
|
+
},
|
|
4050
|
+
{
|
|
4051
|
+
"description": "The page's title.",
|
|
4052
|
+
"name": "title",
|
|
4053
|
+
"required": true,
|
|
4054
|
+
"type": "ReactNode"
|
|
4055
|
+
},
|
|
4056
|
+
{
|
|
4057
|
+
"description": "The direction label above the title (\"Previous\", \"Next\"), from your text catalog.",
|
|
4058
|
+
"name": "label",
|
|
4059
|
+
"required": true,
|
|
4060
|
+
"type": "ReactNode"
|
|
4061
|
+
},
|
|
4062
|
+
{
|
|
4063
|
+
"description": "Client-side navigation: called for a plain primary click (no modifier key). Call `event.preventDefault()`, then your router's navigate.",
|
|
4064
|
+
"name": "onNavigate",
|
|
4065
|
+
"required": false,
|
|
4066
|
+
"type": "OnNavigate"
|
|
4067
|
+
}
|
|
4068
|
+
],
|
|
4069
|
+
"sourcePath": "packages/ui/src/components/PageNav/PageNav.tsx"
|
|
4070
|
+
},
|
|
4071
|
+
"Root": {
|
|
4072
|
+
"name": "Root",
|
|
4073
|
+
"props": [
|
|
4074
|
+
{
|
|
4075
|
+
"description": "Names the landmark (\"Pages\"); required, from your text catalog.",
|
|
4076
|
+
"name": "aria-label",
|
|
4077
|
+
"required": true,
|
|
4078
|
+
"type": "string"
|
|
4079
|
+
},
|
|
4080
|
+
{
|
|
4081
|
+
"description": "A `PageNav.Prev` and/or a `PageNav.Next`.",
|
|
4082
|
+
"name": "children",
|
|
4083
|
+
"required": true,
|
|
4084
|
+
"type": "ReactNode"
|
|
4085
|
+
}
|
|
4086
|
+
],
|
|
4087
|
+
"sourcePath": "packages/ui/src/components/PageNav/PageNav.tsx"
|
|
4088
|
+
}
|
|
4089
|
+
},
|
|
4090
|
+
"props": null,
|
|
4091
|
+
"sourcePath": "packages/ui/src/components/PageNav/PageNav.tsx"
|
|
4092
|
+
},
|
|
3862
4093
|
"PageShell": {
|
|
3863
4094
|
"importPath": "@duro-app/ui",
|
|
3864
4095
|
"kind": "component",
|
|
@@ -4053,7 +4284,7 @@
|
|
|
4053
4284
|
"Popup"
|
|
4054
4285
|
]
|
|
4055
4286
|
},
|
|
4056
|
-
"description": "Non-modal anchored overlay for small interactive content. Compound component — Root is required (throws without it). Anchored to Popover.Trigger, or to a virtual anchor (a () => DOMRect) when there is no Trigger; call reposition() through a ref when the anchor moves.",
|
|
4287
|
+
"description": "Non-modal anchored overlay for small interactive content. Compound component — Root is required (throws without it). Anchored to Popover.Trigger, or to a virtual anchor (a () => DOMRect) when there is no Trigger; call reposition() through a ref when the anchor moves. Popover.Trigger takes size=\"small\" beside small Toggles. Popover.Popup raised draws it over another floating surface (floatingRaised, popoverRaised in a modal), never over a modal.",
|
|
4057
4288
|
"example": "const ref = useRef<PopoverHandle>(null)\nconst anchor = () => new DOMRect(point.x, point.y, 0, 0)\n\n<Popover.Root ref={ref} open={open} onOpenChange={setOpen} anchor={anchor} side=\"bottom\" align=\"start\">\n <Popover.Popup label=\"Edit label\">\n <Field.Root>\n <Field.Label>Label</Field.Label>\n <Input value={label} onChange={(e) => setLabel(e.target.value)} />\n </Field.Root>\n <Popover.Close>Done</Popover.Close>\n </Popover.Popup>\n</Popover.Root>\n// after the anchor moves: ref.current?.reposition()",
|
|
4058
4289
|
"relatedTo": [
|
|
4059
4290
|
{
|
|
@@ -4102,6 +4333,7 @@
|
|
|
4102
4333
|
"whenToUse": [
|
|
4103
4334
|
"A small form or controls tied to one element that stay open while you work in them",
|
|
4104
4335
|
"Anchoring to a spot that is not a button (a canvas point, a text selection) with a virtual anchor",
|
|
4336
|
+
"One floating surface over another (a link editor over a selection format bar) — Popover.Popup raised",
|
|
4105
4337
|
"Holding a Select or Combobox: their portalled list counts as inside the popover, so choosing an item keeps it open; Escape closes an open Select, Combobox or Menu before the popover"
|
|
4106
4338
|
]
|
|
4107
4339
|
},
|
|
@@ -4131,6 +4363,12 @@
|
|
|
4131
4363
|
"name": "label",
|
|
4132
4364
|
"required": true,
|
|
4133
4365
|
"type": "string"
|
|
4366
|
+
},
|
|
4367
|
+
{
|
|
4368
|
+
"description": "Draw over another floating surface: `layers.floatingRaised` outside a modal, `layers.popoverRaised` inside a Dialog or Drawer, instead of `floating` / `popover`. For one floating thing that must cover a sibling one (a link editor over a format bar), never for covering a modal: a Dialog opened later still covers it. A Popover nested inside a raised one is raised too. Default: inherited, else `false`.",
|
|
4369
|
+
"name": "raised",
|
|
4370
|
+
"required": false,
|
|
4371
|
+
"type": "boolean"
|
|
4134
4372
|
}
|
|
4135
4373
|
],
|
|
4136
4374
|
"sourcePath": "packages/ui/src/components/Popover/Popover.tsx"
|
|
@@ -4205,6 +4443,17 @@
|
|
|
4205
4443
|
"required": false,
|
|
4206
4444
|
"type": "string"
|
|
4207
4445
|
},
|
|
4446
|
+
{
|
|
4447
|
+
"default": "'default'",
|
|
4448
|
+
"description": "`small` matches a small Toggle or Button beside it. Default: `default`.",
|
|
4449
|
+
"name": "size",
|
|
4450
|
+
"required": false,
|
|
4451
|
+
"type": "ControlSize",
|
|
4452
|
+
"union": [
|
|
4453
|
+
"default",
|
|
4454
|
+
"small"
|
|
4455
|
+
]
|
|
4456
|
+
},
|
|
4208
4457
|
{
|
|
4209
4458
|
"description": "The trigger <button>, e.g. to measure it or return focus to it.",
|
|
4210
4459
|
"name": "ref",
|
|
@@ -4457,7 +4706,7 @@
|
|
|
4457
4706
|
"Item"
|
|
4458
4707
|
]
|
|
4459
4708
|
},
|
|
4460
|
-
"description": "Dropdown select for choosing one value from a list. Compound component — Root is required (throws without it).",
|
|
4709
|
+
"description": "Dropdown select for choosing one value from a list. Compound component — Root is required (throws without it). Select.Trigger takes size=\"small\" to match small Toggles and Buttons in a toolbar.",
|
|
4461
4710
|
"example": "<Select.Root name=\"role\" defaultValue=\"viewer\">\n <Select.Trigger>\n <Select.Value placeholder=\"Select role\" />\n <Select.Icon />\n </Select.Trigger>\n <Select.Popup>\n <Select.Item value=\"admin\">Admin</Select.Item>\n <Select.Item value=\"editor\">Editor</Select.Item>\n <Select.Item value=\"viewer\">Viewer</Select.Item>\n </Select.Popup>\n</Select.Root>",
|
|
4462
4711
|
"relatedTo": [
|
|
4463
4712
|
{
|
|
@@ -4585,6 +4834,17 @@
|
|
|
4585
4834
|
"name": "aria-label",
|
|
4586
4835
|
"required": false,
|
|
4587
4836
|
"type": "string"
|
|
4837
|
+
},
|
|
4838
|
+
{
|
|
4839
|
+
"default": "'default'",
|
|
4840
|
+
"description": "`small` matches a small Toggle or Button beside it. Default: `default`.",
|
|
4841
|
+
"name": "size",
|
|
4842
|
+
"required": false,
|
|
4843
|
+
"type": "ControlSize",
|
|
4844
|
+
"union": [
|
|
4845
|
+
"default",
|
|
4846
|
+
"small"
|
|
4847
|
+
]
|
|
4588
4848
|
}
|
|
4589
4849
|
],
|
|
4590
4850
|
"sourcePath": "packages/ui/src/components/Select/Select.tsx"
|
|
@@ -4876,7 +5136,14 @@
|
|
|
4876
5136
|
{
|
|
4877
5137
|
"name": "name",
|
|
4878
5138
|
"required": true,
|
|
4879
|
-
"type": "StatusIconName"
|
|
5139
|
+
"type": "StatusIconName",
|
|
5140
|
+
"union": [
|
|
5141
|
+
"x-circle",
|
|
5142
|
+
"check-circle",
|
|
5143
|
+
"check-done",
|
|
5144
|
+
"clock",
|
|
5145
|
+
"forbidden"
|
|
5146
|
+
]
|
|
4880
5147
|
},
|
|
4881
5148
|
{
|
|
4882
5149
|
"default": "'xxl'",
|
|
@@ -5333,6 +5600,17 @@
|
|
|
5333
5600
|
"name": "rowKey",
|
|
5334
5601
|
"required": false,
|
|
5335
5602
|
"type": "(row: Row<TData>) => string"
|
|
5603
|
+
},
|
|
5604
|
+
{
|
|
5605
|
+
"name": "onRowClick",
|
|
5606
|
+
"required": false,
|
|
5607
|
+
"type": "(row: Row<TData>) => void"
|
|
5608
|
+
},
|
|
5609
|
+
{
|
|
5610
|
+
"description": "Accessible name for each clickable row. Required because the row's visible cell content alone is rarely a useful accessible name.",
|
|
5611
|
+
"name": "rowAriaLabel",
|
|
5612
|
+
"required": false,
|
|
5613
|
+
"type": "(row: Row<TData>) => string"
|
|
5336
5614
|
}
|
|
5337
5615
|
],
|
|
5338
5616
|
"sourcePath": "packages/ui/src/components/Table/FromTanstack.tsx"
|
|
@@ -5517,6 +5795,131 @@
|
|
|
5517
5795
|
"props": null,
|
|
5518
5796
|
"sourcePath": "packages/ui/src/table.ts"
|
|
5519
5797
|
},
|
|
5798
|
+
"TableOfContents": {
|
|
5799
|
+
"importPath": "@duro-app/ui",
|
|
5800
|
+
"kind": "compound",
|
|
5801
|
+
"meta": {
|
|
5802
|
+
"anatomy": {
|
|
5803
|
+
"required": [
|
|
5804
|
+
"Root",
|
|
5805
|
+
"Item"
|
|
5806
|
+
]
|
|
5807
|
+
},
|
|
5808
|
+
"description": "The \"On this page\" list of a long page's sections: a labelled nav of in-page links (href=\"#id\", level 2 or 3). value is the id of the section being read; that item gets aria-current=\"location\", the nav marker bar and a heavier weight. variant=\"menu\" puts the list behind a disclosure button (aria-expanded) for narrow screens; the disclosure state (open, defaultOpen and its change callback) exists on the menu variant only. No scroll-spy inside: the app computes value. Compound component — Root is required.",
|
|
5809
|
+
"example": "<TableOfContents.Root aria-label=\"On this page\" label=\"On this page\" value={activeId}>\n <TableOfContents.Item href=\"#components\">The components</TableOfContents.Item>\n <TableOfContents.Item href=\"#wiring\">Wiring</TableOfContents.Item>\n <TableOfContents.Item href=\"#webhooks\" level={3}>Webhooks</TableOfContents.Item>\n</TableOfContents.Root>\n\n// narrow screens\n<TableOfContents.Root aria-label=\"On this page\" variant=\"menu\" value={activeId}>\n …\n</TableOfContents.Root>",
|
|
5810
|
+
"relatedTo": [
|
|
5811
|
+
{
|
|
5812
|
+
"component": "Tabs",
|
|
5813
|
+
"kind": "contrast",
|
|
5814
|
+
"relationship": "Tabs swap the content in place; TableOfContents links to sections of one long page"
|
|
5815
|
+
},
|
|
5816
|
+
{
|
|
5817
|
+
"component": "PageNav",
|
|
5818
|
+
"kind": "contrast",
|
|
5819
|
+
"relationship": "TableOfContents moves within the page; PageNav moves to the next page"
|
|
5820
|
+
}
|
|
5821
|
+
],
|
|
5822
|
+
"whenNotToUse": [
|
|
5823
|
+
"Navigation between pages — use SideNav, Tree or Breadcrumb",
|
|
5824
|
+
"Switching views of one record — use Tabs",
|
|
5825
|
+
"A page with no H2/H3 — render nothing instead of an empty list"
|
|
5826
|
+
],
|
|
5827
|
+
"whenToUse": [
|
|
5828
|
+
"A long document page (docs, a runbook, an ADR) with H2/H3 sections",
|
|
5829
|
+
"variant=\"menu\" for the same list on a narrow screen, above the body"
|
|
5830
|
+
]
|
|
5831
|
+
},
|
|
5832
|
+
"name": "TableOfContents",
|
|
5833
|
+
"parts": {
|
|
5834
|
+
"Item": {
|
|
5835
|
+
"name": "Item",
|
|
5836
|
+
"props": [
|
|
5837
|
+
{
|
|
5838
|
+
"description": "The section's anchor, `#<heading id>`.",
|
|
5839
|
+
"name": "href",
|
|
5840
|
+
"required": true,
|
|
5841
|
+
"type": "string"
|
|
5842
|
+
},
|
|
5843
|
+
{
|
|
5844
|
+
"default": "2",
|
|
5845
|
+
"description": "The heading's level: 2, or 3 (indented under the 2 before it).",
|
|
5846
|
+
"name": "level",
|
|
5847
|
+
"required": false,
|
|
5848
|
+
"type": "2 | 3"
|
|
5849
|
+
},
|
|
5850
|
+
{
|
|
5851
|
+
"description": "Client-side navigation: called for a plain primary click (no modifier key). Call `event.preventDefault()`, then scroll or navigate yourself.",
|
|
5852
|
+
"name": "onNavigate",
|
|
5853
|
+
"required": false,
|
|
5854
|
+
"type": "OnNavigate"
|
|
5855
|
+
},
|
|
5856
|
+
{
|
|
5857
|
+
"name": "children",
|
|
5858
|
+
"required": true,
|
|
5859
|
+
"type": "ReactNode"
|
|
5860
|
+
}
|
|
5861
|
+
],
|
|
5862
|
+
"sourcePath": "packages/ui/src/components/TableOfContents/TableOfContents.tsx"
|
|
5863
|
+
},
|
|
5864
|
+
"Root": {
|
|
5865
|
+
"name": "Root",
|
|
5866
|
+
"props": [
|
|
5867
|
+
{
|
|
5868
|
+
"description": "Names the landmark (\"On this page\"); required, from your text catalog.",
|
|
5869
|
+
"name": "aria-label",
|
|
5870
|
+
"required": true,
|
|
5871
|
+
"type": "string"
|
|
5872
|
+
},
|
|
5873
|
+
{
|
|
5874
|
+
"default": "null",
|
|
5875
|
+
"description": "The id of the section being read; the Item whose href is `#<value>` is active.",
|
|
5876
|
+
"name": "value",
|
|
5877
|
+
"required": false,
|
|
5878
|
+
"type": "string | null"
|
|
5879
|
+
},
|
|
5880
|
+
{
|
|
5881
|
+
"description": "Visible title: the caption above the list, or the menu button's text. The menu button falls back to `aria-label`; the list shows none without it.",
|
|
5882
|
+
"name": "label",
|
|
5883
|
+
"required": false,
|
|
5884
|
+
"type": "ReactNode"
|
|
5885
|
+
},
|
|
5886
|
+
{
|
|
5887
|
+
"name": "children",
|
|
5888
|
+
"required": true,
|
|
5889
|
+
"type": "ReactNode"
|
|
5890
|
+
},
|
|
5891
|
+
{
|
|
5892
|
+
"default": "'list'",
|
|
5893
|
+
"description": "`list` (default) for a sidebar; `menu` for a narrow screen, behind a disclosure button (only `menu` takes open / defaultOpen / onOpenChange).",
|
|
5894
|
+
"name": "variant",
|
|
5895
|
+
"required": false,
|
|
5896
|
+
"type": "'list' | 'menu'"
|
|
5897
|
+
},
|
|
5898
|
+
{
|
|
5899
|
+
"description": "Whether the list is shown (controlled).",
|
|
5900
|
+
"name": "open",
|
|
5901
|
+
"required": false,
|
|
5902
|
+
"type": "boolean"
|
|
5903
|
+
},
|
|
5904
|
+
{
|
|
5905
|
+
"default": "false",
|
|
5906
|
+
"description": "Whether the list starts shown (uncontrolled; default false).",
|
|
5907
|
+
"name": "defaultOpen",
|
|
5908
|
+
"required": false,
|
|
5909
|
+
"type": "boolean"
|
|
5910
|
+
},
|
|
5911
|
+
{
|
|
5912
|
+
"name": "onOpenChange",
|
|
5913
|
+
"required": false,
|
|
5914
|
+
"type": "(open: boolean) => void"
|
|
5915
|
+
}
|
|
5916
|
+
],
|
|
5917
|
+
"sourcePath": "packages/ui/src/components/TableOfContents/TableOfContents.tsx"
|
|
5918
|
+
}
|
|
5919
|
+
},
|
|
5920
|
+
"props": null,
|
|
5921
|
+
"sourcePath": "packages/ui/src/components/TableOfContents/TableOfContents.tsx"
|
|
5922
|
+
},
|
|
5520
5923
|
"Tabs": {
|
|
5521
5924
|
"importPath": "@duro-app/ui",
|
|
5522
5925
|
"kind": "compound",
|
|
@@ -5993,7 +6396,7 @@
|
|
|
5993
6396
|
"importPath": "@duro-app/ui",
|
|
5994
6397
|
"kind": "component",
|
|
5995
6398
|
"meta": {
|
|
5996
|
-
"description": "Inline hyperlink for running text and standalone text links (\"View all\", \"Edit profile\"). Always underlined, so colour is never the only cue: default is accent text with an accent underline; subtle keeps the surrounding text colour with a muted underline and turns accent on hover. target=\"_blank\" defaults rel to noopener noreferrer.",
|
|
6399
|
+
"description": "Inline hyperlink for running text and standalone text links (\"View all\", \"Edit profile\"). Always underlined, so colour is never the only cue: default is accent text with an accent underline; subtle keeps the surrounding text colour with a muted underline and turns accent on hover. target=\"_blank\" defaults rel to noopener noreferrer. onNavigate(href, event) hands a plain primary click to a client router (the app calls event.preventDefault(), then navigates); modified clicks keep the browser default.",
|
|
5997
6400
|
"example": "<Text>\n Read the <TextLink href=\"/docs/migrate\">migration guide</TextLink> before you change seats, or{' '}\n <TextLink href=\"/plans\" variant=\"subtle\">compare plans</TextLink> first.\n</Text>",
|
|
5998
6401
|
"relatedTo": [
|
|
5999
6402
|
{
|
|
@@ -6053,6 +6456,12 @@
|
|
|
6053
6456
|
"required": false,
|
|
6054
6457
|
"type": "string"
|
|
6055
6458
|
},
|
|
6459
|
+
{
|
|
6460
|
+
"description": "Client-side navigation: called for a plain primary click (no modifier key, no `target`); the browser default runs for every other click. Call `event.preventDefault()`, then your router's navigate.",
|
|
6461
|
+
"name": "onNavigate",
|
|
6462
|
+
"required": false,
|
|
6463
|
+
"type": "OnNavigate"
|
|
6464
|
+
},
|
|
6056
6465
|
{
|
|
6057
6466
|
"name": "children",
|
|
6058
6467
|
"required": true,
|
|
@@ -6599,7 +7008,7 @@
|
|
|
6599
7008
|
"Item"
|
|
6600
7009
|
]
|
|
6601
7010
|
},
|
|
6602
|
-
"description": "Hierarchy of items with single selection and expandable branches (the WAI-ARIA tree pattern): one tab stop, arrow keys, Home/End, typeahead. Compound component — Root is required.",
|
|
7011
|
+
"description": "Hierarchy of items with single selection and expandable branches (the WAI-ARIA tree pattern): one tab stop, arrow keys, Home/End, typeahead. An Item with href renders its row as a real link (cmd-click opens a tab) outside the tab order; Enter/Space follows it, through onNavigate(href, event) when given. Compound component — Root is required.",
|
|
6603
7012
|
"example": "<Tree.Root aria-label=\"Blocs\" defaultExpanded={['energy']} onValueChange={setSelected}>\n <Tree.Item value=\"energy\" label=\"Core business — Energy\">\n <Tree.Item value=\"generation\" label=\"Generation\" meta=\"4 apps\" />\n <Tree.Item value=\"network\" label=\"Network operations\">\n <Tree.Item value=\"scada\" label=\"SCADA supervision\" />\n </Tree.Item>\n </Tree.Item>\n <Tree.Item value=\"finance\" label=\"Finance & steering\" />\n</Tree.Root>",
|
|
6604
7013
|
"relatedTo": [
|
|
6605
7014
|
{
|
|
@@ -6620,7 +7029,8 @@
|
|
|
6620
7029
|
],
|
|
6621
7030
|
"whenToUse": [
|
|
6622
7031
|
"Browsing data that nests to any depth — a file tree, zones › services › capabilities, namespace › resource",
|
|
6623
|
-
"Picking one node of a hierarchy to show its details beside the tree"
|
|
7032
|
+
"Picking one node of a hierarchy to show its details beside the tree",
|
|
7033
|
+
"A docs tree of sections and pages, each Item with href (and onNavigate for a client router)"
|
|
6624
7034
|
]
|
|
6625
7035
|
},
|
|
6626
7036
|
"name": "Tree",
|
|
@@ -6657,6 +7067,18 @@
|
|
|
6657
7067
|
"name": "meta",
|
|
6658
7068
|
"required": false,
|
|
6659
7069
|
"type": "ReactNode"
|
|
7070
|
+
},
|
|
7071
|
+
{
|
|
7072
|
+
"description": "Makes the row a link to this URL. A plain click (or Enter / Space) selects the item and calls `onNavigate`; a modified click keeps the browser default (new tab, new window) and does not select.",
|
|
7073
|
+
"name": "href",
|
|
7074
|
+
"required": false,
|
|
7075
|
+
"type": "string"
|
|
7076
|
+
},
|
|
7077
|
+
{
|
|
7078
|
+
"description": "Client-side navigation for `href`: called for a plain primary click. Call `event.preventDefault()`, then your router's navigate.",
|
|
7079
|
+
"name": "onNavigate",
|
|
7080
|
+
"required": false,
|
|
7081
|
+
"type": "OnNavigate"
|
|
6660
7082
|
}
|
|
6661
7083
|
],
|
|
6662
7084
|
"sourcePath": "packages/ui/src/components/Tree/Tree.tsx"
|
|
@@ -7032,6 +7454,14 @@
|
|
|
7032
7454
|
"props": [],
|
|
7033
7455
|
"sourcePath": "packages/ui/src/components/DragDrop/DragDrop.tsx"
|
|
7034
7456
|
},
|
|
7457
|
+
"useInModal": {
|
|
7458
|
+
"importPath": "@duro-app/ui",
|
|
7459
|
+
"kind": "hook",
|
|
7460
|
+
"meta": null,
|
|
7461
|
+
"name": "useInModal",
|
|
7462
|
+
"props": [],
|
|
7463
|
+
"sourcePath": "packages/ui/src/shared/ModalContext.ts"
|
|
7464
|
+
},
|
|
7035
7465
|
"usePortalMount": {
|
|
7036
7466
|
"importPath": "@duro-app/ui",
|
|
7037
7467
|
"kind": "hook",
|
|
@@ -7243,7 +7673,7 @@
|
|
|
7243
7673
|
"admin-detail-page": {
|
|
7244
7674
|
"export": "AdminDetailPageRecipe",
|
|
7245
7675
|
"meta": {
|
|
7246
|
-
"description": "Admin detail page for one record:
|
|
7676
|
+
"description": "Admin detail page for one record: a Breadcrumb back to the collection, heading with status and actions, then Tabs whose panels hold the sections (the /admin/<collection>/:id shape).",
|
|
7247
7677
|
"example": "<AdminDetailPageRecipe />",
|
|
7248
7678
|
"whenNotToUse": [
|
|
7249
7679
|
"One facet only — a PageShell with a Card is enough",
|
|
@@ -7256,17 +7686,17 @@
|
|
|
7256
7686
|
},
|
|
7257
7687
|
"name": "admin-detail-page",
|
|
7258
7688
|
"peerDeps": [],
|
|
7259
|
-
"source": "import {PageShell, Tabs, Stack, Inline, Heading, Text, Badge, Button,
|
|
7689
|
+
"source": "import {PageShell, Tabs, Stack, Inline, Heading, Text, Badge, Button, Breadcrumb, Card, EmptyState} from '@duro-app/ui'\n\nfunction Header() {\n return (\n <Stack gap=\"sm\">\n <Breadcrumb.Root aria-label=\"Breadcrumb\">\n <Breadcrumb.Item href=\"#admin\">Admin</Breadcrumb.Item>\n <Breadcrumb.Item href=\"#applications\">Applications</Breadcrumb.Item>\n <Breadcrumb.Item current>Grafana</Breadcrumb.Item>\n </Breadcrumb.Root>\n <Inline gap=\"md\" align=\"center\" justify=\"between\">\n <Inline gap=\"sm\" align=\"center\">\n <Heading level={1}>Grafana</Heading>\n <Badge variant=\"success\">active</Badge>\n </Inline>\n <Inline gap=\"sm\">\n <Button variant=\"secondary\">Edit</Button>\n <Button variant=\"danger\">Retire</Button>\n </Inline>\n </Inline>\n </Stack>\n )\n}\n\nexport function AdminDetailPageRecipe() {\n return (\n <PageShell maxWidth=\"lg\" padding=\"md\" header={<Header />}>\n <Tabs.Root defaultValue=\"overview\">\n <Tabs.List>\n <Tabs.Tab value=\"overview\">Overview</Tabs.Tab>\n <Tabs.Tab value=\"members\">Members</Tabs.Tab>\n <Tabs.Tab value=\"approvals\">Approvals</Tabs.Tab>\n <Tabs.Tab value=\"audit\">Audit</Tabs.Tab>\n </Tabs.List>\n\n <Tabs.Panel value=\"overview\">\n <Stack gap=\"lg\">\n <Card>\n <Stack gap=\"sm\">\n <Heading level={3}>About</Heading>\n <Text color=\"muted\">\n Dashboards for the platform team. Owned by platform, reachable at grafana.example.\n </Text>\n </Stack>\n </Card>\n <Card>\n <Stack gap=\"sm\">\n <Heading level={3}>Access</Heading>\n <Text>3 roles · 2 entitlements · 41 grants</Text>\n </Stack>\n </Card>\n </Stack>\n </Tabs.Panel>\n\n <Tabs.Panel value=\"members\">\n <EmptyState message=\"No members yet.\" action={<Button>Add member</Button>} />\n </Tabs.Panel>\n <Tabs.Panel value=\"approvals\">\n <EmptyState message=\"Every grant is auto-approved. Add a gate to require a decision.\" />\n </Tabs.Panel>\n <Tabs.Panel value=\"audit\">\n <EmptyState message=\"Nothing recorded for this application.\" />\n </Tabs.Panel>\n </Tabs.Root>\n </PageShell>\n )\n}\n",
|
|
7260
7690
|
"sourcePath": "docs/ai/recipes/admin-detail-page.recipe.tsx",
|
|
7261
7691
|
"title": "Admin Detail Page",
|
|
7262
7692
|
"usesComponents": [
|
|
7263
7693
|
"Badge",
|
|
7694
|
+
"Breadcrumb",
|
|
7264
7695
|
"Button",
|
|
7265
7696
|
"Card",
|
|
7266
7697
|
"EmptyState",
|
|
7267
7698
|
"Heading",
|
|
7268
7699
|
"Inline",
|
|
7269
|
-
"LinkButton",
|
|
7270
7700
|
"PageShell",
|
|
7271
7701
|
"Stack",
|
|
7272
7702
|
"Tabs",
|
|
@@ -8018,6 +8448,10 @@
|
|
|
8018
8448
|
"key": "floating",
|
|
8019
8449
|
"value": "50"
|
|
8020
8450
|
},
|
|
8451
|
+
{
|
|
8452
|
+
"key": "floatingRaised",
|
|
8453
|
+
"value": "60"
|
|
8454
|
+
},
|
|
8021
8455
|
{
|
|
8022
8456
|
"key": "overlay",
|
|
8023
8457
|
"value": "1000"
|
|
@@ -8034,6 +8468,10 @@
|
|
|
8034
8468
|
"key": "popover",
|
|
8035
8469
|
"value": "1040"
|
|
8036
8470
|
},
|
|
8471
|
+
{
|
|
8472
|
+
"key": "popoverRaised",
|
|
8473
|
+
"value": "1041"
|
|
8474
|
+
},
|
|
8037
8475
|
{
|
|
8038
8476
|
"key": "popupBackdrop",
|
|
8039
8477
|
"value": "1049"
|
|
@@ -8715,7 +9153,7 @@
|
|
|
8715
9153
|
"importPath": "@duro-app/tokens/tokens/typography.css"
|
|
8716
9154
|
}
|
|
8717
9155
|
},
|
|
8718
|
-
"mockupCss": "/*\n * GENERATED by scripts/generate-mockup-css.mjs — do not edit.\n *\n * The design tokens as resolved values, for HTML that loads no stylesheet\n * (mockup artboards, static previews). Same names as vars.css; where vars.css\n * follows the live theme, this file carries every theme and switches on\n * <html data-theme=\"light|high-contrast\">.\n *\n * Inside the component library and the apps, never use this: go through\n * css.create() and the token imports, or vars.css from plain CSS.\n */\n:root {\n color-scheme: dark;\n /* colors */\n --duro-color-accent: #6aaffc;\n --duro-color-accent-contrast: #000000;\n --duro-color-accent-hover: #93c5fd;\n --duro-color-bg: #0f0f0f;\n --duro-color-bg-card: #1a1a1a;\n --duro-color-bg-card-hover: #242424;\n --duro-color-border: #333333;\n --duro-color-contrast-border: rgba(0, 0, 0, 0.42);\n --duro-color-contrast-surface: #f5f5f5;\n --duro-color-error: #f87171;\n --duro-color-error-bg: rgba(248, 113, 113, 0.1);\n --duro-color-error-border: rgba(248, 113, 113, 0.3);\n --duro-color-error-contrast: #000000;\n --duro-color-error-hover: #fca5a5;\n --duro-color-error-text: #fca5a5;\n --duro-color-fixed-light: #ffffff;\n --duro-color-highlight: #c084fc;\n --duro-color-highlight-bg: rgba(192, 132, 252, 0.1);\n --duro-color-highlight-border: rgba(192, 132, 252, 0.3);\n --duro-color-highlight-text: #d8b4fe;\n --duro-color-info: #6aaffc;\n --duro-color-info-bg: rgba(106, 175, 252, 0.1);\n --duro-color-info-border: rgba(106, 175, 252, 0.3);\n --duro-color-info-text: #93c5fd;\n --duro-color-inverse-border: rgba(0, 0, 0, 0.55);\n --duro-color-inverse-border-hover: rgba(0, 0, 0, 0.70);\n --duro-color-inverse-fill: rgba(0, 0, 0, 0.10);\n --duro-color-inverse-fill-hover: rgba(0, 0, 0, 0.18);\n --duro-color-on-contrast-surface: #1a1a1a;\n --duro-color-overlay-light: rgba(255, 255, 255, 0.78);\n --duro-color-scrim: rgba(0, 0, 0, 0.4);\n --duro-color-success: #22c55e;\n --duro-color-success-bg: rgba(34, 197, 94, 0.1);\n --duro-color-success-border: rgba(34, 197, 94, 0.3);\n --duro-color-success-text: #86efac;\n --duro-color-text: #e5e5e5;\n --duro-color-text-muted: #b0b0b0;\n --duro-color-warning: #fbbf24;\n --duro-color-warning-bg: rgba(251, 191, 36, 0.1);\n --duro-color-warning-border: rgba(251, 191, 36, 0.3);\n --duro-color-warning-text: #fde68a;\n /* shadows */\n --duro-shadow-drop-over: inset 0 0 0 2px #6aaffc;\n --duro-shadow-drop-ready: inset 0 0 0 1px #333333;\n --duro-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5);\n --duro-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);\n --duro-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.3);\n /* spacing */\n --duro-spacing-lg: 24px;\n --duro-spacing-md: 16px;\n --duro-spacing-ms: 12px;\n --duro-spacing-sm: 8px;\n --duro-spacing-xl: 32px;\n --duro-spacing-xs: 4px;\n --duro-spacing-xxl: 48px;\n --duro-spacing-xxxl: 64px;\n /* microSpacing */\n --duro-micro-spacing-px1: 1px;\n --duro-micro-spacing-px2: 2px;\n --duro-micro-spacing-px3: 3px;\n --duro-micro-spacing-px5: 5px;\n --duro-micro-spacing-px6: 6px;\n /* radii */\n --duro-radius-full: 9999px;\n --duro-radius-lg: 16px;\n --duro-radius-md: 12px;\n --duro-radius-px6: 6px;\n --duro-radius-sm: 8px;\n --duro-radius-xs: 4px;\n /* sizes */\n --duro-size-aside-w: 320px;\n --duro-size-bar-h: 4px;\n --duro-size-canvas-min-h: 480px;\n --duro-size-check-mark-h: 9px;\n --duro-size-check-mark-w: 5px;\n --duro-size-chip: 24px;\n --duro-size-color-area-h: 150px;\n --duro-size-color-picker-w: 196px;\n --duro-size-color-preview-h: 22px;\n --duro-size-color-swatch: 20px;\n --duro-size-color-track-h: 12px;\n --duro-size-control-lg: 40px;\n --duro-size-control-md: 39px;\n --duro-size-control-sm: 28px;\n --duro-size-day-header-h: 46px;\n --duro-size-device-bar-w: 96px;\n --duro-size-dialog-lg: 680px;\n --duro-size-dialog-md: 520px;\n --duro-size-dialog-sm: 400px;\n --duro-size-divider: 1px;\n --duro-size-drop-zone-min-h: 128px;\n --duro-size-edge-fade: 32px;\n --duro-size-editor-min-h: 160px;\n --duro-size-embed-w: 550px;\n --duro-size-field-min-w: 160px;\n --duro-size-field-min-w-sm: 80px;\n --duro-size-glyph-md: 16px;\n --duro-size-glyph-sm: 12px;\n --duro-size-glyph-xs: 10px;\n --duro-size-grid-col-md: 280px;\n --duro-size-grid-col-sm: 240px;\n --duro-size-grid-col-xs: 200px;\n --duro-size-handle: 16px;\n --duro-size-icon-button: 32px;\n --duro-size-icon-button-sm: 28px;\n --duro-size-icon-lg: 24px;\n --duro-size-icon-md: 18px;\n --duro-size-icon-sm: 16px;\n --duro-size-icon-xl: 36px;\n --duro-size-icon-xxl: 48px;\n --duro-size-indicator: 18px;\n --duro-size-indicator-dot: 8px;\n --duro-size-label-min-w: 120px;\n --duro-size-list-max-h: 280px;\n --duro-size-list-max-h-sm: 200px;\n --duro-size-meter-h: 6px;\n --duro-size-nav-marker-h: 18px;\n --duro-size-nav-marker-w: 3px;\n --duro-size-page-lg: 1200px;\n --duro-size-page-md: 800px;\n --duro-size-page-sm: 600px;\n --duro-size-page-xl: 1440px;\n --duro-size-page-xs: 480px;\n --duro-size-palette-min-w: 96px;\n --duro-size-panel-lg: 640px;\n --duro-size-panel-md: 480px;\n --duro-size-panel-sm: 360px;\n --duro-size-placeholder-min-h: 80px;\n --duro-size-popover-w: 320px;\n --duro-size-popover-w-sm: 240px;\n --duro-size-popup-max-w: 280px;\n --duro-size-popup-min-w: 160px;\n --duro-size-preview-max-h: 320px;\n --duro-size-readout-w: 40px;\n --duro-size-scrollbar: 8px;\n --duro-size-sidebar-w: 240px;\n --duro-size-skeleton-chip-w: 96px;\n --duro-size-slider-w: 96px;\n --duro-size-spinner-lg: 40px;\n --duro-size-spinner-md: 24px;\n --duro-size-spinner-sm: 16px;\n --duro-size-swatch-h: 34px;\n --duro-size-swatch-w: 44px;\n --duro-size-switch-thumb: 16px;\n --duro-size-switch-track-h: 20px;\n --duro-size-switch-track-w: 36px;\n --duro-size-tab-indicator: 2px;\n --duro-size-time-gutter-w: 64px;\n --duro-size-toast-max-w: 440px;\n --duro-size-toolbar-h: 36px;\n --duro-size-touch-target: 44px;\n /* borders */\n --duro-border-accent: 3px;\n --duro-border-focus-offset: 2px;\n --duro-border-focus-offset-sm: 1px;\n --duro-border-focus-ring: 2px;\n --duro-border-hairline: 1px;\n --duro-border-strong: 2px;\n /* layers */\n --duro-layer-floating: 50;\n --duro-layer-modal: 1001;\n --duro-layer-modal-raised: 1002;\n --duro-layer-overlay: 1000;\n --duro-layer-popover: 1040;\n --duro-layer-popup: 1050;\n --duro-layer-popup-backdrop: 1049;\n --duro-layer-portal: 1100;\n --duro-layer-raised: 1;\n --duro-layer-toast: 1060;\n /* effects */\n --duro-effect-overlay-blur: blur(2px);\n --duro-effect-surface-blur: blur(6px);\n /* layoutSpacing */\n --duro-layout-spacing-container-lg: 32px;\n --duro-layout-spacing-container-md: 24px;\n --duro-layout-spacing-container-sm: 16px;\n --duro-layout-spacing-inline-lg: 24px;\n --duro-layout-spacing-inline-md: 16px;\n --duro-layout-spacing-inline-sm: 8px;\n --duro-layout-spacing-inline-xs: 4px;\n --duro-layout-spacing-stack-lg: 24px;\n --duro-layout-spacing-stack-md: 16px;\n --duro-layout-spacing-stack-sm: 8px;\n --duro-layout-spacing-stack-xl: 48px;\n --duro-layout-spacing-stack-xs: 4px;\n /* typography */\n --duro-typography-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n --duro-typography-font-family-mono: \"SF Mono\", \"Fira Code\", \"Fira Mono\", \"Roboto Mono\", \"Courier New\", monospace;\n --duro-typography-font-size-heading: 1.5rem;\n --duro-typography-font-size-lg: 1.125rem;\n --duro-typography-font-size-md: 1rem;\n --duro-typography-font-size-sm: 0.875rem;\n --duro-typography-font-size-xl: 1.25rem;\n --duro-typography-font-size-xs: 0.75rem;\n --duro-typography-font-weight-bold: 700;\n --duro-typography-font-weight-medium: 500;\n --duro-typography-font-weight-normal: 400;\n --duro-typography-font-weight-semibold: 600;\n --duro-typography-line-height: 1.5;\n /* typeScale */\n --duro-type-scale-display-lg: clamp(3.5rem, 2rem + 3.5vw, 4.5rem);\n --duro-type-scale-display-md: clamp(2.75rem, 1.75rem + 2.5vw, 3.75rem);\n --duro-type-scale-display-sm: clamp(2.25rem, 1.5rem + 2vw, 3rem);\n --duro-type-scale-font-size1: 0.75rem;\n --duro-type-scale-font-size2: 0.8125rem;\n --duro-type-scale-font-size3: 0.875rem;\n --duro-type-scale-font-size4: 1rem;\n --duro-type-scale-font-size5: 1.125rem;\n --duro-type-scale-font-size6: 1.25rem;\n --duro-type-scale-font-size7: 1.5rem;\n --duro-type-scale-font-size8: 1.875rem;\n --duro-type-scale-font-size9: 2.25rem;\n --duro-type-scale-letter-spacing-normal: 0;\n --duro-type-scale-letter-spacing-tight: -0.02em;\n --duro-type-scale-letter-spacing-wide: 0.04em;\n --duro-type-scale-line-height1: 1rem;\n --duro-type-scale-line-height2: 1.25rem;\n --duro-type-scale-line-height3: 1.25rem;\n --duro-type-scale-line-height4: 1.5rem;\n --duro-type-scale-line-height5: 1.5rem;\n --duro-type-scale-line-height6: 1.75rem;\n --duro-type-scale-line-height7: 2rem;\n --duro-type-scale-line-height8: 2.25rem;\n --duro-type-scale-line-height9: 2.75rem;\n /* duration */\n --duro-duration-base: 200ms;\n --duro-duration-brisk: 160ms;\n --duro-duration-fast: 150ms;\n --duro-duration-instant: 0ms;\n --duro-duration-minimal: 1ms;\n --duro-duration-quick: 120ms;\n --duro-duration-slow: 280ms;\n /* easing */\n --duro-easing-ease-in: cubic-bezier(0.72, 0, 0.68, 0.28);\n --duro-easing-ease-out: cubic-bezier(0.32, 0.72, 0, 1);\n --duro-easing-linear: linear;\n --duro-easing-standard: ease;\n /* breakpoints */\n --duro-breakpoint-lg: 1024px;\n --duro-breakpoint-md: 768px;\n --duro-breakpoint-sm: 640px;\n --duro-breakpoint-xl: 1280px;\n --duro-breakpoint-xs: 480px;\n}\n\n:root[data-theme=\"light\"] {\n color-scheme: light;\n /* colors */\n --duro-color-accent: #1e40af;\n --duro-color-accent-contrast: #ffffff;\n --duro-color-accent-hover: #1a3799;\n --duro-color-bg: #ffffff;\n --duro-color-bg-card: #f5f5f5;\n --duro-color-bg-card-hover: #ebebeb;\n --duro-color-border: #d4d4d4;\n --duro-color-contrast-border: rgba(255, 255, 255, 0.33);\n --duro-color-contrast-surface: #1a1a1a;\n --duro-color-error: #991b1b;\n --duro-color-error-bg: rgba(153, 27, 27, 0.08);\n --duro-color-error-border: rgba(153, 27, 27, 0.3);\n --duro-color-error-contrast: #ffffff;\n --duro-color-error-hover: #7f1d1d;\n --duro-color-error-text: #7f1d1d;\n --duro-color-fixed-light: #ffffff;\n --duro-color-highlight: #6b21a8;\n --duro-color-highlight-bg: rgba(107, 33, 168, 0.08);\n --duro-color-highlight-border: rgba(107, 33, 168, 0.3);\n --duro-color-highlight-text: #581c87;\n --duro-color-info: #1e40af;\n --duro-color-info-bg: rgba(30, 64, 175, 0.08);\n --duro-color-info-border: rgba(30, 64, 175, 0.3);\n --duro-color-info-text: #1e40af;\n --duro-color-inverse-border: rgba(0, 0, 0, 0.55);\n --duro-color-inverse-border-hover: rgba(0, 0, 0, 0.70);\n --duro-color-inverse-fill: rgba(0, 0, 0, 0.10);\n --duro-color-inverse-fill-hover: rgba(0, 0, 0, 0.18);\n --duro-color-on-contrast-surface: #e5e5e5;\n --duro-color-overlay-light: rgba(255, 255, 255, 0.78);\n --duro-color-scrim: rgba(0, 0, 0, 0.4);\n --duro-color-success: #166534;\n --duro-color-success-bg: rgba(22, 101, 52, 0.08);\n --duro-color-success-border: rgba(22, 101, 52, 0.3);\n --duro-color-success-text: #14532d;\n --duro-color-text: #1a1a1a;\n --duro-color-text-muted: #4a4a4a;\n --duro-color-warning: #92400e;\n --duro-color-warning-bg: rgba(146, 64, 14, 0.08);\n --duro-color-warning-border: rgba(146, 64, 14, 0.3);\n --duro-color-warning-text: #78350f;\n /* shadows */\n --duro-shadow-drop-over: inset 0 0 0 2px #1e40af;\n --duro-shadow-drop-ready: inset 0 0 0 1px #d4d4d4;\n --duro-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.16);\n --duro-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.12);\n --duro-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n:root[data-theme=\"high-contrast\"] {\n color-scheme: dark;\n /* colors */\n --duro-color-accent: #60a5fa;\n --duro-color-accent-contrast: #000000;\n --duro-color-accent-hover: #93c5fd;\n --duro-color-bg: #000000;\n --duro-color-bg-card: #111111;\n --duro-color-bg-card-hover: #1a1a1a;\n --duro-color-border: #555555;\n --duro-color-contrast-border: rgba(0, 0, 0, 0.42);\n --duro-color-contrast-surface: #ffffff;\n --duro-color-error: #f87171;\n --duro-color-error-bg: rgba(248, 113, 113, 0.15);\n --duro-color-error-border: rgba(248, 113, 113, 0.5);\n --duro-color-error-contrast: #000000;\n --duro-color-error-hover: #fca5a5;\n --duro-color-error-text: #fca5a5;\n --duro-color-fixed-light: #ffffff;\n --duro-color-highlight: #d8b4fe;\n --duro-color-highlight-bg: rgba(216, 180, 254, 0.15);\n --duro-color-highlight-border: rgba(216, 180, 254, 0.5);\n --duro-color-highlight-text: #e9d5ff;\n --duro-color-info: #60a5fa;\n --duro-color-info-bg: rgba(96, 165, 250, 0.15);\n --duro-color-info-border: rgba(96, 165, 250, 0.5);\n --duro-color-info-text: #bfdbfe;\n --duro-color-inverse-border: rgba(0, 0, 0, 0.55);\n --duro-color-inverse-border-hover: rgba(0, 0, 0, 0.70);\n --duro-color-inverse-fill: rgba(0, 0, 0, 0.10);\n --duro-color-inverse-fill-hover: rgba(0, 0, 0, 0.18);\n --duro-color-on-contrast-surface: #000000;\n --duro-color-overlay-light: rgba(255, 255, 255, 0.78);\n --duro-color-scrim: rgba(0, 0, 0, 0.4);\n --duro-color-success: #4ade80;\n --duro-color-success-bg: rgba(74, 222, 128, 0.15);\n --duro-color-success-border: rgba(74, 222, 128, 0.5);\n --duro-color-success-text: #86efac;\n --duro-color-text: #ffffff;\n --duro-color-text-muted: #b0b0b0;\n --duro-color-warning: #fcd34d;\n --duro-color-warning-bg: rgba(252, 211, 77, 0.15);\n --duro-color-warning-border: rgba(252, 211, 77, 0.5);\n --duro-color-warning-text: #fef08a;\n /* shadows */\n --duro-shadow-drop-over: inset 0 0 0 2px #60a5fa;\n --duro-shadow-drop-ready: inset 0 0 0 1px #555555;\n --duro-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.8);\n --duro-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.7);\n --duro-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.6);\n}\n"
|
|
9156
|
+
"mockupCss": "/*\n * GENERATED by scripts/generate-mockup-css.mjs — do not edit.\n *\n * The design tokens as resolved values, for HTML that loads no stylesheet\n * (mockup artboards, static previews). Same names as vars.css; where vars.css\n * follows the live theme, this file carries every theme and switches on\n * <html data-theme=\"light|high-contrast\">.\n *\n * Inside the component library and the apps, never use this: go through\n * css.create() and the token imports, or vars.css from plain CSS.\n */\n:root {\n color-scheme: dark;\n /* colors */\n --duro-color-accent: #6aaffc;\n --duro-color-accent-contrast: #000000;\n --duro-color-accent-hover: #93c5fd;\n --duro-color-bg: #0f0f0f;\n --duro-color-bg-card: #1a1a1a;\n --duro-color-bg-card-hover: #242424;\n --duro-color-border: #333333;\n --duro-color-contrast-border: rgba(0, 0, 0, 0.42);\n --duro-color-contrast-surface: #f5f5f5;\n --duro-color-error: #f87171;\n --duro-color-error-bg: rgba(248, 113, 113, 0.1);\n --duro-color-error-border: rgba(248, 113, 113, 0.3);\n --duro-color-error-contrast: #000000;\n --duro-color-error-hover: #fca5a5;\n --duro-color-error-text: #fca5a5;\n --duro-color-fixed-light: #ffffff;\n --duro-color-highlight: #c084fc;\n --duro-color-highlight-bg: rgba(192, 132, 252, 0.1);\n --duro-color-highlight-border: rgba(192, 132, 252, 0.3);\n --duro-color-highlight-text: #d8b4fe;\n --duro-color-info: #6aaffc;\n --duro-color-info-bg: rgba(106, 175, 252, 0.1);\n --duro-color-info-border: rgba(106, 175, 252, 0.3);\n --duro-color-info-text: #93c5fd;\n --duro-color-inverse-border: rgba(0, 0, 0, 0.55);\n --duro-color-inverse-border-hover: rgba(0, 0, 0, 0.70);\n --duro-color-inverse-fill: rgba(0, 0, 0, 0.10);\n --duro-color-inverse-fill-hover: rgba(0, 0, 0, 0.18);\n --duro-color-on-contrast-surface: #1a1a1a;\n --duro-color-overlay-light: rgba(255, 255, 255, 0.78);\n --duro-color-scrim: rgba(0, 0, 0, 0.4);\n --duro-color-success: #22c55e;\n --duro-color-success-bg: rgba(34, 197, 94, 0.1);\n --duro-color-success-border: rgba(34, 197, 94, 0.3);\n --duro-color-success-text: #86efac;\n --duro-color-text: #e5e5e5;\n --duro-color-text-muted: #b0b0b0;\n --duro-color-warning: #fbbf24;\n --duro-color-warning-bg: rgba(251, 191, 36, 0.1);\n --duro-color-warning-border: rgba(251, 191, 36, 0.3);\n --duro-color-warning-text: #fde68a;\n /* shadows */\n --duro-shadow-drop-over: inset 0 0 0 2px #6aaffc;\n --duro-shadow-drop-ready: inset 0 0 0 1px #333333;\n --duro-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5);\n --duro-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);\n --duro-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.3);\n /* spacing */\n --duro-spacing-lg: 24px;\n --duro-spacing-md: 16px;\n --duro-spacing-ms: 12px;\n --duro-spacing-sm: 8px;\n --duro-spacing-xl: 32px;\n --duro-spacing-xs: 4px;\n --duro-spacing-xxl: 48px;\n --duro-spacing-xxxl: 64px;\n /* microSpacing */\n --duro-micro-spacing-px1: 1px;\n --duro-micro-spacing-px2: 2px;\n --duro-micro-spacing-px3: 3px;\n --duro-micro-spacing-px5: 5px;\n --duro-micro-spacing-px6: 6px;\n /* radii */\n --duro-radius-full: 9999px;\n --duro-radius-lg: 16px;\n --duro-radius-md: 12px;\n --duro-radius-px6: 6px;\n --duro-radius-sm: 8px;\n --duro-radius-xs: 4px;\n /* sizes */\n --duro-size-aside-w: 320px;\n --duro-size-bar-h: 4px;\n --duro-size-canvas-min-h: 480px;\n --duro-size-check-mark-h: 9px;\n --duro-size-check-mark-w: 5px;\n --duro-size-chip: 24px;\n --duro-size-color-area-h: 150px;\n --duro-size-color-picker-w: 196px;\n --duro-size-color-preview-h: 22px;\n --duro-size-color-swatch: 20px;\n --duro-size-color-track-h: 12px;\n --duro-size-control-lg: 40px;\n --duro-size-control-md: 39px;\n --duro-size-control-sm: 28px;\n --duro-size-day-header-h: 46px;\n --duro-size-device-bar-w: 96px;\n --duro-size-dialog-lg: 680px;\n --duro-size-dialog-md: 520px;\n --duro-size-dialog-sm: 400px;\n --duro-size-divider: 1px;\n --duro-size-drop-zone-min-h: 128px;\n --duro-size-edge-fade: 32px;\n --duro-size-editor-min-h: 160px;\n --duro-size-embed-w: 550px;\n --duro-size-field-min-w: 160px;\n --duro-size-field-min-w-sm: 80px;\n --duro-size-glyph-md: 16px;\n --duro-size-glyph-sm: 12px;\n --duro-size-glyph-xs: 10px;\n --duro-size-grid-col-md: 280px;\n --duro-size-grid-col-sm: 240px;\n --duro-size-grid-col-xs: 200px;\n --duro-size-handle: 16px;\n --duro-size-icon-button: 32px;\n --duro-size-icon-button-sm: 28px;\n --duro-size-icon-lg: 24px;\n --duro-size-icon-md: 18px;\n --duro-size-icon-sm: 16px;\n --duro-size-icon-xl: 36px;\n --duro-size-icon-xxl: 48px;\n --duro-size-indicator: 18px;\n --duro-size-indicator-dot: 8px;\n --duro-size-label-min-w: 120px;\n --duro-size-list-max-h: 280px;\n --duro-size-list-max-h-sm: 200px;\n --duro-size-meter-h: 6px;\n --duro-size-nav-marker-h: 18px;\n --duro-size-nav-marker-w: 3px;\n --duro-size-page-lg: 1200px;\n --duro-size-page-md: 800px;\n --duro-size-page-sm: 600px;\n --duro-size-page-xl: 1440px;\n --duro-size-page-xs: 480px;\n --duro-size-palette-min-w: 96px;\n --duro-size-panel-lg: 640px;\n --duro-size-panel-md: 480px;\n --duro-size-panel-sm: 360px;\n --duro-size-placeholder-min-h: 80px;\n --duro-size-popover-w: 320px;\n --duro-size-popover-w-sm: 240px;\n --duro-size-popup-max-w: 280px;\n --duro-size-popup-min-w: 160px;\n --duro-size-preview-max-h: 320px;\n --duro-size-readout-w: 40px;\n --duro-size-scrollbar: 8px;\n --duro-size-sidebar-w: 240px;\n --duro-size-skeleton-chip-w: 96px;\n --duro-size-slider-w: 96px;\n --duro-size-spinner-lg: 40px;\n --duro-size-spinner-md: 24px;\n --duro-size-spinner-sm: 16px;\n --duro-size-swatch-h: 34px;\n --duro-size-swatch-w: 44px;\n --duro-size-switch-thumb: 16px;\n --duro-size-switch-track-h: 20px;\n --duro-size-switch-track-w: 36px;\n --duro-size-tab-indicator: 2px;\n --duro-size-time-gutter-w: 64px;\n --duro-size-toast-max-w: 440px;\n --duro-size-toolbar-h: 36px;\n --duro-size-touch-target: 44px;\n /* borders */\n --duro-border-accent: 3px;\n --duro-border-focus-offset: 2px;\n --duro-border-focus-offset-sm: 1px;\n --duro-border-focus-ring: 2px;\n --duro-border-hairline: 1px;\n --duro-border-strong: 2px;\n /* layers */\n --duro-layer-floating: 50;\n --duro-layer-floating-raised: 60;\n --duro-layer-modal: 1001;\n --duro-layer-modal-raised: 1002;\n --duro-layer-overlay: 1000;\n --duro-layer-popover: 1040;\n --duro-layer-popover-raised: 1041;\n --duro-layer-popup: 1050;\n --duro-layer-popup-backdrop: 1049;\n --duro-layer-portal: 1100;\n --duro-layer-raised: 1;\n --duro-layer-toast: 1060;\n /* effects */\n --duro-effect-overlay-blur: blur(2px);\n --duro-effect-surface-blur: blur(6px);\n /* layoutSpacing */\n --duro-layout-spacing-container-lg: 32px;\n --duro-layout-spacing-container-md: 24px;\n --duro-layout-spacing-container-sm: 16px;\n --duro-layout-spacing-inline-lg: 24px;\n --duro-layout-spacing-inline-md: 16px;\n --duro-layout-spacing-inline-sm: 8px;\n --duro-layout-spacing-inline-xs: 4px;\n --duro-layout-spacing-stack-lg: 24px;\n --duro-layout-spacing-stack-md: 16px;\n --duro-layout-spacing-stack-sm: 8px;\n --duro-layout-spacing-stack-xl: 48px;\n --duro-layout-spacing-stack-xs: 4px;\n /* typography */\n --duro-typography-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n --duro-typography-font-family-mono: \"SF Mono\", \"Fira Code\", \"Fira Mono\", \"Roboto Mono\", \"Courier New\", monospace;\n --duro-typography-font-size-heading: 1.5rem;\n --duro-typography-font-size-lg: 1.125rem;\n --duro-typography-font-size-md: 1rem;\n --duro-typography-font-size-sm: 0.875rem;\n --duro-typography-font-size-xl: 1.25rem;\n --duro-typography-font-size-xs: 0.75rem;\n --duro-typography-font-weight-bold: 700;\n --duro-typography-font-weight-medium: 500;\n --duro-typography-font-weight-normal: 400;\n --duro-typography-font-weight-semibold: 600;\n --duro-typography-line-height: 1.5;\n /* typeScale */\n --duro-type-scale-display-lg: clamp(3.5rem, 2rem + 3.5vw, 4.5rem);\n --duro-type-scale-display-md: clamp(2.75rem, 1.75rem + 2.5vw, 3.75rem);\n --duro-type-scale-display-sm: clamp(2.25rem, 1.5rem + 2vw, 3rem);\n --duro-type-scale-font-size1: 0.75rem;\n --duro-type-scale-font-size2: 0.8125rem;\n --duro-type-scale-font-size3: 0.875rem;\n --duro-type-scale-font-size4: 1rem;\n --duro-type-scale-font-size5: 1.125rem;\n --duro-type-scale-font-size6: 1.25rem;\n --duro-type-scale-font-size7: 1.5rem;\n --duro-type-scale-font-size8: 1.875rem;\n --duro-type-scale-font-size9: 2.25rem;\n --duro-type-scale-letter-spacing-normal: 0;\n --duro-type-scale-letter-spacing-tight: -0.02em;\n --duro-type-scale-letter-spacing-wide: 0.04em;\n --duro-type-scale-line-height1: 1rem;\n --duro-type-scale-line-height2: 1.25rem;\n --duro-type-scale-line-height3: 1.25rem;\n --duro-type-scale-line-height4: 1.5rem;\n --duro-type-scale-line-height5: 1.5rem;\n --duro-type-scale-line-height6: 1.75rem;\n --duro-type-scale-line-height7: 2rem;\n --duro-type-scale-line-height8: 2.25rem;\n --duro-type-scale-line-height9: 2.75rem;\n /* duration */\n --duro-duration-base: 200ms;\n --duro-duration-brisk: 160ms;\n --duro-duration-fast: 150ms;\n --duro-duration-instant: 0ms;\n --duro-duration-minimal: 1ms;\n --duro-duration-quick: 120ms;\n --duro-duration-slow: 280ms;\n /* easing */\n --duro-easing-ease-in: cubic-bezier(0.72, 0, 0.68, 0.28);\n --duro-easing-ease-out: cubic-bezier(0.32, 0.72, 0, 1);\n --duro-easing-linear: linear;\n --duro-easing-standard: ease;\n /* breakpoints */\n --duro-breakpoint-lg: 1024px;\n --duro-breakpoint-md: 768px;\n --duro-breakpoint-sm: 640px;\n --duro-breakpoint-xl: 1280px;\n --duro-breakpoint-xs: 480px;\n}\n\n:root[data-theme=\"light\"] {\n color-scheme: light;\n /* colors */\n --duro-color-accent: #1e40af;\n --duro-color-accent-contrast: #ffffff;\n --duro-color-accent-hover: #1a3799;\n --duro-color-bg: #ffffff;\n --duro-color-bg-card: #f5f5f5;\n --duro-color-bg-card-hover: #ebebeb;\n --duro-color-border: #d4d4d4;\n --duro-color-contrast-border: rgba(255, 255, 255, 0.33);\n --duro-color-contrast-surface: #1a1a1a;\n --duro-color-error: #991b1b;\n --duro-color-error-bg: rgba(153, 27, 27, 0.08);\n --duro-color-error-border: rgba(153, 27, 27, 0.3);\n --duro-color-error-contrast: #ffffff;\n --duro-color-error-hover: #7f1d1d;\n --duro-color-error-text: #7f1d1d;\n --duro-color-fixed-light: #ffffff;\n --duro-color-highlight: #6b21a8;\n --duro-color-highlight-bg: rgba(107, 33, 168, 0.08);\n --duro-color-highlight-border: rgba(107, 33, 168, 0.3);\n --duro-color-highlight-text: #581c87;\n --duro-color-info: #1e40af;\n --duro-color-info-bg: rgba(30, 64, 175, 0.08);\n --duro-color-info-border: rgba(30, 64, 175, 0.3);\n --duro-color-info-text: #1e40af;\n --duro-color-inverse-border: rgba(0, 0, 0, 0.55);\n --duro-color-inverse-border-hover: rgba(0, 0, 0, 0.70);\n --duro-color-inverse-fill: rgba(0, 0, 0, 0.10);\n --duro-color-inverse-fill-hover: rgba(0, 0, 0, 0.18);\n --duro-color-on-contrast-surface: #e5e5e5;\n --duro-color-overlay-light: rgba(255, 255, 255, 0.78);\n --duro-color-scrim: rgba(0, 0, 0, 0.4);\n --duro-color-success: #166534;\n --duro-color-success-bg: rgba(22, 101, 52, 0.08);\n --duro-color-success-border: rgba(22, 101, 52, 0.3);\n --duro-color-success-text: #14532d;\n --duro-color-text: #1a1a1a;\n --duro-color-text-muted: #4a4a4a;\n --duro-color-warning: #92400e;\n --duro-color-warning-bg: rgba(146, 64, 14, 0.08);\n --duro-color-warning-border: rgba(146, 64, 14, 0.3);\n --duro-color-warning-text: #78350f;\n /* shadows */\n --duro-shadow-drop-over: inset 0 0 0 2px #1e40af;\n --duro-shadow-drop-ready: inset 0 0 0 1px #d4d4d4;\n --duro-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.16);\n --duro-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.12);\n --duro-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);\n}\n\n:root[data-theme=\"high-contrast\"] {\n color-scheme: dark;\n /* colors */\n --duro-color-accent: #60a5fa;\n --duro-color-accent-contrast: #000000;\n --duro-color-accent-hover: #93c5fd;\n --duro-color-bg: #000000;\n --duro-color-bg-card: #111111;\n --duro-color-bg-card-hover: #1a1a1a;\n --duro-color-border: #555555;\n --duro-color-contrast-border: rgba(0, 0, 0, 0.42);\n --duro-color-contrast-surface: #ffffff;\n --duro-color-error: #f87171;\n --duro-color-error-bg: rgba(248, 113, 113, 0.15);\n --duro-color-error-border: rgba(248, 113, 113, 0.5);\n --duro-color-error-contrast: #000000;\n --duro-color-error-hover: #fca5a5;\n --duro-color-error-text: #fca5a5;\n --duro-color-fixed-light: #ffffff;\n --duro-color-highlight: #d8b4fe;\n --duro-color-highlight-bg: rgba(216, 180, 254, 0.15);\n --duro-color-highlight-border: rgba(216, 180, 254, 0.5);\n --duro-color-highlight-text: #e9d5ff;\n --duro-color-info: #60a5fa;\n --duro-color-info-bg: rgba(96, 165, 250, 0.15);\n --duro-color-info-border: rgba(96, 165, 250, 0.5);\n --duro-color-info-text: #bfdbfe;\n --duro-color-inverse-border: rgba(0, 0, 0, 0.55);\n --duro-color-inverse-border-hover: rgba(0, 0, 0, 0.70);\n --duro-color-inverse-fill: rgba(0, 0, 0, 0.10);\n --duro-color-inverse-fill-hover: rgba(0, 0, 0, 0.18);\n --duro-color-on-contrast-surface: #000000;\n --duro-color-overlay-light: rgba(255, 255, 255, 0.78);\n --duro-color-scrim: rgba(0, 0, 0, 0.4);\n --duro-color-success: #4ade80;\n --duro-color-success-bg: rgba(74, 222, 128, 0.15);\n --duro-color-success-border: rgba(74, 222, 128, 0.5);\n --duro-color-success-text: #86efac;\n --duro-color-text: #ffffff;\n --duro-color-text-muted: #b0b0b0;\n --duro-color-warning: #fcd34d;\n --duro-color-warning-bg: rgba(252, 211, 77, 0.15);\n --duro-color-warning-border: rgba(252, 211, 77, 0.5);\n --duro-color-warning-text: #fef08a;\n /* shadows */\n --duro-shadow-drop-over: inset 0 0 0 2px #60a5fa;\n --duro-shadow-drop-ready: inset 0 0 0 1px #555555;\n --duro-shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.8);\n --duro-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.7);\n --duro-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.6);\n}\n"
|
|
8719
9157
|
},
|
|
8720
9158
|
"unions": {
|
|
8721
9159
|
"AlertVariant": [
|
|
@@ -8776,6 +9214,10 @@
|
|
|
8776
9214
|
"default",
|
|
8777
9215
|
"spacious"
|
|
8778
9216
|
],
|
|
9217
|
+
"ControlSize": [
|
|
9218
|
+
"default",
|
|
9219
|
+
"small"
|
|
9220
|
+
],
|
|
8779
9221
|
"DetailPanelSize": [
|
|
8780
9222
|
"sm",
|
|
8781
9223
|
"md"
|
|
@@ -8804,6 +9246,14 @@
|
|
|
8804
9246
|
"base",
|
|
8805
9247
|
"slow"
|
|
8806
9248
|
],
|
|
9249
|
+
"FieldsetGap": [
|
|
9250
|
+
"xs",
|
|
9251
|
+
"sm",
|
|
9252
|
+
"ms",
|
|
9253
|
+
"md",
|
|
9254
|
+
"lg",
|
|
9255
|
+
"xl"
|
|
9256
|
+
],
|
|
8807
9257
|
"HeadingVariant": [
|
|
8808
9258
|
"displayLg",
|
|
8809
9259
|
"displayMd",
|
|
@@ -8952,6 +9402,13 @@
|
|
|
8952
9402
|
"md",
|
|
8953
9403
|
"lg"
|
|
8954
9404
|
],
|
|
9405
|
+
"StatusIconName": [
|
|
9406
|
+
"x-circle",
|
|
9407
|
+
"check-circle",
|
|
9408
|
+
"check-done",
|
|
9409
|
+
"clock",
|
|
9410
|
+
"forbidden"
|
|
9411
|
+
],
|
|
8955
9412
|
"StatusIconVariant": [
|
|
8956
9413
|
"error",
|
|
8957
9414
|
"success",
|
|
@@ -8959,6 +9416,10 @@
|
|
|
8959
9416
|
"info",
|
|
8960
9417
|
"muted"
|
|
8961
9418
|
],
|
|
9419
|
+
"TableOfContentsVariant": [
|
|
9420
|
+
"list",
|
|
9421
|
+
"menu"
|
|
9422
|
+
],
|
|
8962
9423
|
"TableSize": [
|
|
8963
9424
|
"sm",
|
|
8964
9425
|
"md"
|