@skdx/docs-kit 0.35.0 → 0.36.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.
@@ -1296,6 +1296,14 @@
1296
1296
  "declared": true,
1297
1297
  "internal": false
1298
1298
  },
1299
+ {
1300
+ "name": "data-skdx-slot",
1301
+ "frameworks": [
1302
+ "web-components"
1303
+ ],
1304
+ "declared": false,
1305
+ "internal": false
1306
+ },
1299
1307
  {
1300
1308
  "name": "data-state",
1301
1309
  "frameworks": [
@@ -1351,6 +1359,14 @@
1351
1359
  "declared": true,
1352
1360
  "internal": false
1353
1361
  },
1362
+ {
1363
+ "name": "data-skdx-slot",
1364
+ "frameworks": [
1365
+ "web-components"
1366
+ ],
1367
+ "declared": false,
1368
+ "internal": false
1369
+ },
1354
1370
  {
1355
1371
  "name": "data-status",
1356
1372
  "frameworks": [
@@ -2417,6 +2433,14 @@
2417
2433
  ],
2418
2434
  "declared": true,
2419
2435
  "internal": false
2436
+ },
2437
+ {
2438
+ "name": "data-skdx-slot",
2439
+ "frameworks": [
2440
+ "web-components"
2441
+ ],
2442
+ "declared": false,
2443
+ "internal": false
2420
2444
  }
2421
2445
  ],
2422
2446
  "cssCustomProperties": []
@@ -2449,6 +2473,14 @@
2449
2473
  "declared": true,
2450
2474
  "internal": false
2451
2475
  },
2476
+ {
2477
+ "name": "data-skdx-slot",
2478
+ "frameworks": [
2479
+ "web-components"
2480
+ ],
2481
+ "declared": false,
2482
+ "internal": false
2483
+ },
2452
2484
  {
2453
2485
  "name": "data-state",
2454
2486
  "frameworks": [
@@ -2504,6 +2536,14 @@
2504
2536
  "declared": true,
2505
2537
  "internal": false
2506
2538
  },
2539
+ {
2540
+ "name": "data-skdx-slot",
2541
+ "frameworks": [
2542
+ "web-components"
2543
+ ],
2544
+ "declared": false,
2545
+ "internal": false
2546
+ },
2507
2547
  {
2508
2548
  "name": "data-status",
2509
2549
  "frameworks": [
@@ -3265,6 +3305,14 @@
3265
3305
  ],
3266
3306
  "declared": true,
3267
3307
  "internal": false
3308
+ },
3309
+ {
3310
+ "name": "data-skdx-slot",
3311
+ "frameworks": [
3312
+ "web-components"
3313
+ ],
3314
+ "declared": false,
3315
+ "internal": false
3268
3316
  }
3269
3317
  ],
3270
3318
  "cssCustomProperties": []
@@ -3543,6 +3591,14 @@
3543
3591
  ],
3544
3592
  "declared": true,
3545
3593
  "internal": false
3594
+ },
3595
+ {
3596
+ "name": "data-skdx-slot",
3597
+ "frameworks": [
3598
+ "web-components"
3599
+ ],
3600
+ "declared": false,
3601
+ "internal": false
3546
3602
  }
3547
3603
  ],
3548
3604
  "cssCustomProperties": []
@@ -3748,6 +3804,14 @@
3748
3804
  ],
3749
3805
  "declared": true,
3750
3806
  "internal": false
3807
+ },
3808
+ {
3809
+ "name": "data-skdx-slot",
3810
+ "frameworks": [
3811
+ "web-components"
3812
+ ],
3813
+ "declared": false,
3814
+ "internal": false
3751
3815
  }
3752
3816
  ],
3753
3817
  "cssCustomProperties": []
@@ -3883,6 +3947,14 @@
3883
3947
  "declared": true,
3884
3948
  "internal": false
3885
3949
  },
3950
+ {
3951
+ "name": "data-skdx-slot",
3952
+ "frameworks": [
3953
+ "web-components"
3954
+ ],
3955
+ "declared": false,
3956
+ "internal": false
3957
+ },
3886
3958
  {
3887
3959
  "name": "data-variant",
3888
3960
  "frameworks": [
@@ -4966,6 +5038,14 @@
4966
5038
  ],
4967
5039
  "declared": true,
4968
5040
  "internal": false
5041
+ },
5042
+ {
5043
+ "name": "data-skdx-slot",
5044
+ "frameworks": [
5045
+ "web-components"
5046
+ ],
5047
+ "declared": false,
5048
+ "internal": false
4969
5049
  }
4970
5050
  ],
4971
5051
  "cssCustomProperties": []
@@ -5134,6 +5214,14 @@
5134
5214
  ],
5135
5215
  "declared": true,
5136
5216
  "internal": false
5217
+ },
5218
+ {
5219
+ "name": "data-skdx-slot",
5220
+ "frameworks": [
5221
+ "web-components"
5222
+ ],
5223
+ "declared": false,
5224
+ "internal": false
5137
5225
  }
5138
5226
  ],
5139
5227
  "cssCustomProperties": []
@@ -6114,6 +6202,14 @@
6114
6202
  ],
6115
6203
  "declared": true,
6116
6204
  "internal": false
6205
+ },
6206
+ {
6207
+ "name": "data-skdx-slot",
6208
+ "frameworks": [
6209
+ "web-components"
6210
+ ],
6211
+ "declared": false,
6212
+ "internal": false
6117
6213
  }
6118
6214
  ],
6119
6215
  "cssCustomProperties": []
@@ -6785,6 +6881,14 @@
6785
6881
  ],
6786
6882
  "declared": true,
6787
6883
  "internal": false
6884
+ },
6885
+ {
6886
+ "name": "data-skdx-slot",
6887
+ "frameworks": [
6888
+ "web-components"
6889
+ ],
6890
+ "declared": false,
6891
+ "internal": false
6788
6892
  }
6789
6893
  ],
6790
6894
  "cssCustomProperties": []
@@ -7212,6 +7316,14 @@
7212
7316
  "declared": true,
7213
7317
  "internal": false
7214
7318
  },
7319
+ {
7320
+ "name": "data-skdx-slot",
7321
+ "frameworks": [
7322
+ "web-components"
7323
+ ],
7324
+ "declared": false,
7325
+ "internal": false
7326
+ },
7215
7327
  {
7216
7328
  "name": "data-skdx-stat-card-generated",
7217
7329
  "frameworks": [
@@ -10167,6 +10279,14 @@
10167
10279
  "declared": true,
10168
10280
  "internal": false
10169
10281
  },
10282
+ {
10283
+ "name": "data-skdx-slot",
10284
+ "frameworks": [
10285
+ "web-components"
10286
+ ],
10287
+ "declared": false,
10288
+ "internal": false
10289
+ },
10170
10290
  {
10171
10291
  "name": "data-skdx-usage-card-generated",
10172
10292
  "frameworks": [
@@ -10222,6 +10342,14 @@
10222
10342
  "declared": true,
10223
10343
  "internal": false
10224
10344
  },
10345
+ {
10346
+ "name": "data-skdx-slot",
10347
+ "frameworks": [
10348
+ "web-components"
10349
+ ],
10350
+ "declared": false,
10351
+ "internal": false
10352
+ },
10225
10353
  {
10226
10354
  "name": "data-skdx-user-menu-generated",
10227
10355
  "frameworks": [
@@ -10265,6 +10393,14 @@
10265
10393
  "declared": true,
10266
10394
  "internal": false
10267
10395
  },
10396
+ {
10397
+ "name": "data-skdx-slot",
10398
+ "frameworks": [
10399
+ "web-components"
10400
+ ],
10401
+ "declared": false,
10402
+ "internal": false
10403
+ },
10268
10404
  {
10269
10405
  "name": "data-skdx-verification-page-content",
10270
10406
  "frameworks": [
@@ -10316,6 +10452,14 @@
10316
10452
  "declared": true,
10317
10453
  "internal": false
10318
10454
  },
10455
+ {
10456
+ "name": "data-skdx-slot",
10457
+ "frameworks": [
10458
+ "web-components"
10459
+ ],
10460
+ "declared": false,
10461
+ "internal": false
10462
+ },
10319
10463
  {
10320
10464
  "name": "data-skdx-workspace-switcher-generated",
10321
10465
  "frameworks": [
@@ -1 +1 @@
1
- import{changeDetail as e}from"./change-reason.js";import{ROOT_DATA_ATTRIBUTES as t}from"./styling-hooks.js";var o={name:"VerificationPage",purpose:"A one-time-code block composing Heading, Text, Alert, Form, Field, PinInput and Button. It collects a code of a fixed length, reports it through a verify event once it is complete, and offers a resend control whose cooldown the consumer owns. Ships in the blocks package of each framework, not the core package.",props:[{name:"title",type:"string",defaultValue:"'Enter your verification code'",required:!1,description:"Heading text, rendered into a derived <h1> that names the section."},{name:"description",type:"string",required:!1,description:"Supporting copy rendered into a derived Text below the title, naming where the code was sent. No description region renders when omitted."},{name:"error",type:"string",required:!1,description:"Message rendered into a derived error Alert above the form. The block never clears it: set it from the verify handler and reset it when the next attempt starts."},{name:"pending",type:"boolean",defaultValue:"false",required:!1,description:"Marks the request in flight, making the submit button busy and unusable while the code boxes stay editable, so the user can still correct a digit."},{name:"codeLabel",type:"string",defaultValue:"'Verification code'",required:!1,description:"Field label and accessible name of the derived pin input holding the code, so the group of boxes is announced as one control."},{name:"length",type:"number",defaultValue:"6",required:!1,description:"How many character boxes the code is entered into, and how long a complete code is before it may be submitted."},{name:"value",type:"string",required:!1,description:"Current code, for controlled usage; pair it with the value-change event. Uncontrolled, the pin input tracks the code itself."},{name:"defaultValue",type:"string",required:!1,description:"Initial code, for uncontrolled usage \u2014 seeds the boxes on first render and leaves the rest empty."},{name:"submitLabel",type:"string",defaultValue:"'Verify'",required:!1,description:"Text of the form submit button."},{name:"resendLabel",type:"string",defaultValue:"'Resend code'",required:!1,description:"Text of the resend button, which renders only alongside a resend event handler."},{name:"resendDisabled",type:"boolean",defaultValue:"false",required:!1,description:"Makes the resend button unusable, for a consumer running its own cooldown between requests."},{name:"resendHint",type:"string",required:!1,description:"Note rendered beside the resend button, such as how long the cooldown has left. The block runs no timer of its own."},{name:"footer",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Navigation rendered below the resend region, such as a link back to the sign-in page. No footer region renders when omitted. A prop in React, Svelte, and Angular; Vue and Web Components use the `footer` slot."}],events:[{name:"verify",detail:"{ code: string }",description:"Fires when the form is submitted with a code of exactly the declared length, carrying that code. The native submit is prevented, so the consumer performs the check and sets error on failure."},{name:"resend",detail:"void",description:"Fires when the resend button is activated. Handling it is what renders the resend region at all; the cooldown between requests belongs to the consumer."},{name:"value-change",detail:e("string"),description:"Fires with the new code whenever any box changes, controlled or not, so a consumer can mirror the code or clear a stale error."}],slots:[{name:"default",description:"Extra fields rendered inside the form, above the submit button."},{name:"footer",description:"Navigation below the resend region, such as a link back to the sign-in page."}],states:["default"],controlledUncontrolled:"The code is controllable through value with the value-change event, or seeded with defaultValue and tracked by the pin input; error and pending are always controlled by the consumer.",formBehavior:"The form is a core Form root whose pin input submits the joined code as one required entry with a length pattern, so a short code is refused by constraint validation and emits nothing.",validationBehavior:"The code is required and only satisfies its constraint once every box is filled; the block adds no validators and never times the resend cooldown.",accessibility:{role:"region (native <section> named by its heading through aria-labelledby)",keyboard:[{key:"ArrowLeft/ArrowRight",behavior:"Moves between the code boxes, which the pin input wires itself."},{key:"Enter",behavior:"Submits the form while a code box has focus (native form submission)."}],ariaAttributes:["aria-labelledby on the <section> points at the derived heading","the pin input group carries aria-label from codeLabel, so the boxes are announced as one named control","the derived error Alert is a live region, so a new error is announced without moving focus"],focusManagement:"Focus follows the code boxes as the pin input advances them; a refused submit reports through constraint validation rather than a jump of the block's own."},styling:{cssParts:["verification-page","panel","title","description","error","form","field","code","submit","resend","resend-hint","footer"],dataAttributes:[...t,{name:"data-skdx-verification-page-generated",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'},{name:"data-skdx-verification-page-content",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'}],cssCustomProperties:[]},publicMethods:[]};export{o as verificationPageContract};
1
+ import{changeDetail as e}from"./change-reason.js";import{ROOT_DATA_ATTRIBUTES as t}from"./styling-hooks.js";var o={name:"VerificationPage",purpose:"A one-time-code block composing Heading, Text, Alert, Form, Fieldset, PinInput and Button. It collects a code of a fixed length, reports it through a verify event once it is complete, and offers a resend control whose cooldown the consumer owns. Ships in the blocks package of each framework, not the core package.",props:[{name:"title",type:"string",defaultValue:"'Enter your verification code'",required:!1,description:"Heading text, rendered into a derived <h1> that names the section."},{name:"description",type:"string",required:!1,description:"Supporting copy rendered into a derived Text below the title, naming where the code was sent. No description region renders when omitted."},{name:"error",type:"string",required:!1,description:"Message rendered into a derived error Alert above the form. The block never clears it: set it from the verify handler and reset it when the next attempt starts."},{name:"pending",type:"boolean",defaultValue:"false",required:!1,description:"Marks the request in flight, making the submit button busy and unusable while the code boxes stay editable, so the user can still correct a digit."},{name:"codeLabel",type:"string",defaultValue:"'Verification code'",required:!1,description:"Legend of the code fieldset and accessible name of the derived pin input holding the code, so the group of boxes is announced as one control."},{name:"length",type:"number",defaultValue:"6",required:!1,description:"How many character boxes the code is entered into, and how long a complete code is before it may be submitted."},{name:"value",type:"string",required:!1,description:"Current code, for controlled usage; pair it with the value-change event. Uncontrolled, the pin input tracks the code itself."},{name:"defaultValue",type:"string",required:!1,description:"Initial code, for uncontrolled usage \u2014 seeds the boxes on first render and leaves the rest empty."},{name:"submitLabel",type:"string",defaultValue:"'Verify'",required:!1,description:"Text of the form submit button."},{name:"resendLabel",type:"string",defaultValue:"'Resend code'",required:!1,description:"Text of the resend button, which renders only alongside a resend event handler."},{name:"resendDisabled",type:"boolean",defaultValue:"false",required:!1,description:"Makes the resend button unusable, for a consumer running its own cooldown between requests."},{name:"resendHint",type:"string",required:!1,description:"Note rendered beside the resend button, such as how long the cooldown has left. The block runs no timer of its own."},{name:"footer",type:"unknown",required:!1,frameworks:["react","svelte","angular"],exception:"render-prop",frameworksReason:"Vue and Web Components take this as a named slot rather than a prop \u2014 Vue because a renderable region is a slot in Vue's own idiom, Web Components because a custom element attribute carries a string and cannot carry a node. Both slot spellings are declared under `slots`.",description:"Navigation rendered below the resend region, such as a link back to the sign-in page. No footer region renders when omitted. A prop in React, Svelte, and Angular; Vue and Web Components use the `footer` slot."}],events:[{name:"verify",detail:"{ code: string }",description:"Fires when the form is submitted with a code of exactly the declared length, carrying that code. The native submit is prevented, so the consumer performs the check and sets error on failure."},{name:"resend",detail:"void",description:"Fires when the resend button is activated. Handling it is what renders the resend region at all; the cooldown between requests belongs to the consumer."},{name:"value-change",detail:e("string"),description:"Fires with the new code whenever any box changes, controlled or not, so a consumer can mirror the code or clear a stale error."}],slots:[{name:"default",description:"Extra fields rendered inside the form, above the submit button."},{name:"footer",description:"Navigation below the resend region, such as a link back to the sign-in page."}],states:["default"],controlledUncontrolled:"The code is controllable through value with the value-change event, or seeded with defaultValue and tracked by the pin input; error and pending are always controlled by the consumer.",formBehavior:"The form is a core Form root whose pin input submits the joined code as one required entry with a length pattern, so a short code is refused by constraint validation and emits nothing.",validationBehavior:"The code is required and only satisfies its constraint once every box is filled; the block adds no validators and never times the resend cooldown.",accessibility:{role:"region (native <section> named by its heading through aria-labelledby)",keyboard:[{key:"ArrowLeft/ArrowRight",behavior:"Moves between the code boxes, which the pin input wires itself."},{key:"Enter",behavior:"Submits the form while a code box has focus (native form submission)."}],ariaAttributes:["aria-labelledby on the <section> points at the derived heading","the pin input group carries aria-label from codeLabel, so the boxes are announced as one named control","the derived error Alert is a live region, so a new error is announced without moving focus"],focusManagement:"Focus follows the code boxes as the pin input advances them; a refused submit reports through constraint validation rather than a jump of the block's own."},styling:{cssParts:["verification-page","panel","title","description","error","form","field","code","submit","resend","resend-hint","footer"],dataAttributes:[...t,{name:"data-skdx-verification-page-generated",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'},{name:"data-skdx-verification-page-content",frameworks:["webComponents"],exception:"wc-marker",frameworksReason:'Marks a node the element generated for itself rather than one the consumer authored. React, Vue, Svelte and Angular re-render their derived anatomy declaratively, so "mine or theirs" is answered by the framework and no marker is needed.'}],cssCustomProperties:[]},publicMethods:[]};export{o as verificationPageContract};
@@ -1 +1 @@
1
- import{dateToFormValue as c,parseDateFormValue as m}from"./date-segments.js";var g=/^(\d{4,})-(\d{2})$/,p=/^(\d{4,}-\d{2}-\d{2})/,d=!1;function M(){d=!1}function f(e,n){d||(d=!0,console.warn(`[skdx] ${n?`\`${n}\``:"A date property"} was given ${JSON.stringify(e)}, which is not an ISO-8601 date. Expected \`YYYY-MM-DD\`, \`YYYY-MM-DDTHH:mm[:ss]\`, or a bare \`YYYY-MM\` for a month. The value is ignored \u2014 the property behaves as if it had not been supplied \u2014 rather than being coerced to today, to the epoch, or to an \`Invalid Date\` that would then poison every comparison after it.`))}function i(e,n){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(typeof e!="string")return null;let t=e.trim();if(t==="")return null;let r=m(t);if(r!==null){let l=p.exec(t)?.[1];return l!==void 0&&o(r)!==l?(f(t,n),null):r}let a=y(t);return a||(f(t,n),null)}function y(e){let n=g.exec(e);if(!n)return null;let t=Number(n[2])-1;if(t<0||t>11)return null;let r=Number(n[1]),a=new Date(r,t,1);return r<100&&a.setFullYear(r),Number.isNaN(a.getTime())?null:a}function o(e,n="day"){return c(e,n)}function I(e,n,t){if(e===void 0)return;if(e===null)return n==="multiple"?[]:null;if(typeof e=="string"){let l=h(e,t);return s(l,n)}if(Array.isArray(e)){let l=e.map(u=>i(u,t)).filter(u=>u!==null);return s(l,n)}if(e instanceof Date)return s(i(e,t),n);let r=e,a=i(r.start,t);return a===null?n==="multiple"?[]:null:{start:a,end:i(r.end,t)}}function s(e,n){return n!=="multiple"?e:e===null?[]:Array.isArray(e)?e:e instanceof Date?[e]:[]}function h(e,n){let t=e.trim();if(t==="")return null;if(t.includes("/")){let[r="",a=""]=t.split("/"),l=i(r,n);return l===null?null:{start:l,end:a===""?null:i(a,n)}}return t.includes(",")?t.split(",").map(r=>i(r,n)).filter(r=>r!==null):i(t,n)}function Y(e){return e==null?null:Array.isArray(e)?e.length===0?null:e.map(n=>o(n)).join(","):e instanceof Date?o(e):`${o(e.start)}/${e.end===null?"":o(e.end)}`}var N=/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/;function b(e,n){if(e==null)return null;if(e instanceof Date){if(Number.isNaN(e.getTime()))return null;let a=D=>String(D).padStart(2,"0"),l=e.getSeconds(),u=`${a(e.getHours())}:${a(e.getMinutes())}`;return l===0?u:`${u}:${a(l)}`}if(typeof e!="string")return null;let t=e.trim();if(t==="")return null;let r=N.exec(t);return!r||Number(r[1])>23||Number(r[2])>59||r[3]!==void 0&&Number(r[3])>59?(f(t,n),null):t}export{M as resetMalformedDateWarning,Y as toCalendarString,I as toCalendarValue,i as toDate,o as toISODateValue,b as toTimeValue};
1
+ import{dateToFormValue as c,parseDateFormValue as m}from"./date-segments.js";var g=/^(\d{4,})-(\d{2})$/,p=/^(\d{4,}-\d{2}-\d{2})/,y=/^\d{4,}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:?\d{2})$/,s=!1;function M(){s=!1}function f(e,n){s||(s=!0,console.warn(`[skdx] ${n?`\`${n}\``:"A date property"} was given ${JSON.stringify(e)}, which is not an ISO-8601 date. Expected \`YYYY-MM-DD\`, \`YYYY-MM-DDTHH:mm[:ss]\`, an instant with \`Z\` or a \`\xB1HH:mm\` offset, or a bare \`YYYY-MM\` for a month. The value is ignored \u2014 the property behaves as if it had not been supplied \u2014 rather than being coerced to today, to the epoch, or to an \`Invalid Date\` that would then poison every comparison after it.`))}function l(e,n){if(e==null)return null;if(e instanceof Date)return Number.isNaN(e.getTime())?null:e;if(typeof e!="string")return null;let t=e.trim();if(t==="")return null;let r=m(t);if(r!==null){let i=p.exec(t)?.[1];return i!==void 0&&o(r)!==i?(f(t,n),null):r}if(y.test(t)){let i=new Date(t);if(!Number.isNaN(i.getTime()))return i}let a=N(t);return a||(f(t,n),null)}function N(e){let n=g.exec(e);if(!n)return null;let t=Number(n[2])-1;if(t<0||t>11)return null;let r=Number(n[1]),a=new Date(r,t,1);return r<100&&a.setFullYear(r),Number.isNaN(a.getTime())?null:a}function o(e,n="day"){return c(e,n)}function b(e,n,t){if(e===void 0)return;if(e===null)return n==="multiple"?[]:null;if(typeof e=="string"){let i=h(e,t);return d(i,n)}if(Array.isArray(e)){let i=e.map(u=>l(u,t)).filter(u=>u!==null);return d(i,n)}if(e instanceof Date)return d(l(e,t),n);let r=e,a=l(r.start,t);return a===null?n==="multiple"?[]:null:{start:a,end:l(r.end,t)}}function d(e,n){return n!=="multiple"?e:e===null?[]:Array.isArray(e)?e:e instanceof Date?[e]:[]}function h(e,n){let t=e.trim();if(t==="")return null;if(t.includes("/")){let[r="",a=""]=t.split("/"),i=l(r,n);return i===null?null:{start:i,end:a===""?null:l(a,n)}}return t.includes(",")?t.split(",").map(r=>l(r,n)).filter(r=>r!==null):l(t,n)}function Y(e){return e==null?null:Array.isArray(e)?e.length===0?null:e.map(n=>o(n)).join(","):e instanceof Date?o(e):`${o(e.start)}/${e.end===null?"":o(e.end)}`}var I=/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/;function T(e,n){if(e==null)return null;if(e instanceof Date){if(Number.isNaN(e.getTime()))return null;let a=D=>String(D).padStart(2,"0"),i=e.getSeconds(),u=`${a(e.getHours())}:${a(e.getMinutes())}`;return i===0?u:`${u}:${a(i)}`}if(typeof e!="string")return null;let t=e.trim();if(t==="")return null;let r=I.exec(t);return!r||Number(r[1])>23||Number(r[2])>59||r[3]!==void 0&&Number(r[3])>59?(f(t,n),null):t}export{M as resetMalformedDateWarning,Y as toCalendarString,b as toCalendarValue,l as toDate,o as toISODateValue,T as toTimeValue};
@@ -0,0 +1 @@
1
+ export declare function activateLabelledButton(label: HTMLElement, event: Event): void;
@@ -0,0 +1 @@
1
+ var l='a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])',i="radio, checkbox, switch, menuitemcheckbox, menuitemradio",u='button, [role="radio"], [role="checkbox"], [role="switch"]';function s(t){let e=t instanceof HTMLButtonElement||i.split(", ").includes(t.getAttribute("role")??"")?t:t.querySelector(u);return!(e instanceof HTMLElement)||e instanceof HTMLInputElement||e.disabled||e.getAttribute("aria-disabled")==="true"?null:e}function a(t,n){let e=`#${CSS.escape(n)}`;for(let o=t.parentElement;o;o=o.parentElement){let r=o.querySelector(e);if(r)return r}return t.getRootNode().getElementById(n)}function f(t,n){if(n.defaultPrevented)return;let e=t.getAttribute("for");if(!e)return;let o=n.target instanceof Element?n.target:null;if(o&&o!==t&&o.closest(l)!==t.closest(l))return;let r=a(t,e),c=r&&s(r);c&&(n.preventDefault(),c.focus(),c.click())}export{f as activateLabelledButton};
@@ -6,3 +6,12 @@ export declare const TABBABLE_SELECTOR: string;
6
6
  * small subtrees only in the DOM while open.
7
7
  */
8
8
  export declare function tabbablesWithin(container: Element): HTMLElement[];
9
+ /**
10
+ * Keeps Tab cycling inside `container` while it is the modal surface: Tab from the last tabbable
11
+ * lands on the first and Shift+Tab from the first on the last. A native `showModal()` leaves the
12
+ * loop through the browser chrome instead, which assistive technology reads as focus escaping.
13
+ *
14
+ * @param container the modal surface, typically the open `<dialog>`
15
+ * @param event the keydown to act on; anything but an unhandled Tab is ignored
16
+ */
17
+ export declare function wrapTabWithin(container: Element, event: KeyboardEvent): void;
@@ -1 +1 @@
1
- var e=["a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");function n(t){return Array.from(t.querySelectorAll(e))}export{e as TABBABLE_SELECTOR,n as tabbablesWithin};
1
+ var r=["a[href]","button:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");function d(e){return Array.from(e.querySelectorAll("*")).filter(t=>t.matches(r)||t.shadowRoot?.delegatesFocus===!0)}function u(e,t){if(t.key!=="Tab"||t.defaultPrevented)return;let o=d(e);if(o.length===0){t.preventDefault();return}let a=o[0],s=o[o.length-1],n=document.activeElement,i=n===null||n===e||!e.contains(n),l=t.shiftKey?n===a:n===s;!i&&!l||(t.preventDefault(),(t.shiftKey?s:a).focus())}export{r as TABBABLE_SELECTOR,d as tabbablesWithin,u as wrapTabWithin};
@@ -79,6 +79,7 @@
79
79
  --skdx-border-width-thick: 2px;
80
80
  --skdx-border-width-thicker: 4px;
81
81
  --skdx-opacity-disabled: 0.5;
82
+ --skdx-opacity-muted: 0.7;
82
83
  --skdx-opacity-scrim: 0.6;
83
84
  --skdx-control-height-sm: 1.875rem;
84
85
  --skdx-control-height-md: 2.25rem;
@@ -75,8 +75,9 @@
75
75
  text-align: center;
76
76
  }
77
77
 
78
+ /* Muted, not disabled: the text is still meant to be read while the send is in flight. */
78
79
  :where(.skdx-chat-message)[data-status='pending'] :where(.skdx-chat-message__content) {
79
- opacity: var(--skdx-opacity-disabled);
80
+ opacity: var(--skdx-opacity-muted);
80
81
  }
81
82
 
82
83
  :where(.skdx-chat-message__attachments) {
@@ -54,9 +54,15 @@
54
54
  gap: var(--skdx-space-3);
55
55
  }
56
56
 
57
- :where(.skdx-onboarding-checklist__item)[data-state='disabled'] {
57
+ /* The indicator and action fade as disabled controls; the title stays readable text, muted. */
58
+ :where(.skdx-onboarding-checklist__item)[data-state='disabled']
59
+ :where(.skdx-onboarding-checklist__indicator, .skdx-onboarding-checklist__action) {
58
60
  opacity: var(--skdx-opacity-disabled);
59
61
  }
62
+ :where(.skdx-onboarding-checklist__item)[data-state='disabled']
63
+ :where(.skdx-onboarding-checklist__item-title) {
64
+ color: var(--skdx-color-text-muted);
65
+ }
60
66
 
61
67
  :where(.skdx-onboarding-checklist__indicator) {
62
68
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skdx/docs-kit",
3
- "version": "0.35.0",
3
+ "version": "0.36.0",
4
4
  "description": "Build-time toolkit for the SKDX documentation site: the shared contracts, the framework table, generated manifests and the source files the docs measure. Not a public API — no semver guarantees, may change in any release.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/SkandaDX/ui.skdx/tree/main/internal/docs-kit#readme",
@@ -36,19 +36,19 @@
36
36
  "access": "public"
37
37
  },
38
38
  "devDependencies": {
39
- "@skdx/angular": "0.35.0",
40
- "@skdx/angular-blocks": "0.35.0",
41
- "@skdx/react-blocks": "0.35.0",
42
- "@skdx/shared": "0.35.0",
43
- "@skdx/svelte": "0.35.0",
44
- "@skdx/react": "0.35.0",
45
- "@skdx/vue": "0.35.0",
46
- "@skdx/skins": "0.35.0",
47
- "@skdx/vue-blocks": "0.35.0",
48
- "@skdx/tokens": "0.35.0",
49
- "@skdx/web-components": "0.35.0",
50
- "@skdx/svelte-blocks": "0.35.0",
51
- "@skdx/web-components-blocks": "0.35.0"
39
+ "@skdx/angular": "0.36.0",
40
+ "@skdx/angular-blocks": "0.36.0",
41
+ "@skdx/react-blocks": "0.36.0",
42
+ "@skdx/react": "0.36.0",
43
+ "@skdx/skins": "0.36.0",
44
+ "@skdx/svelte-blocks": "0.36.0",
45
+ "@skdx/shared": "0.36.0",
46
+ "@skdx/tokens": "0.36.0",
47
+ "@skdx/svelte": "0.36.0",
48
+ "@skdx/vue": "0.36.0",
49
+ "@skdx/vue-blocks": "0.36.0",
50
+ "@skdx/web-components-blocks": "0.36.0",
51
+ "@skdx/web-components": "0.36.0"
52
52
  },
53
53
  "nx": {
54
54
  "targets": {